skip to Main Content

I had htaccess which worked for many years with a command like this:

RewriteRule ^products/(.*).php  product.php?page=$1&%{QUERY_STRING}

Mapping all items under products folder to be served with product.php file

Today, suddenly all URLs started giving 404. After many hours of digging, I found that the command now works only if there is an actual file (even empty file – it doesn’t matter) under the products folder. For example, products/p1.php would work only if p1.php resides under the products folder.

I also run a test and added:

RewriteRule ^tests/(.*).php  tests/index.php

and an index.php file under tests folder with hello world. It will only work for files that actually in tests folder. tests/testing.php will show index.php content only if there is a file testing.php in tests folder.

Does anybody have an idea what could have changed at the server configuration to cause this or if there is a way to fix my command to work without an actual file in the location of the URL?

Edited 1st of November 2018:

I found this in the httpd.conf:

<IfModule proxy_fcgi_module>
<FilesMatch .(phtml|php[0-9]*)$>
SetHandler proxy:unix:/opt/cpanel/ea-php70/root/usr/var/run/php-fpm/.sock|fcgi://mydomain.com
</FilesMatch>
RewriteCond %{REQUEST_FILENAME} .php$
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f
RewriteRule (.*) - [H=text/html]
</IfModule>

Could that be the reason?

Another Update:

So this line

RewriteRule ^tests/(.*)  tests/index.php

Will work for existing files and also for non-existing directory.
so tests/dir1/ will redirect fine. But test/file.php will only redirect if file.php actually exist.

One more update (sorry I’m debugging it and finding our more stuff):

The redirect will fail only for PHP files! all other files will work correctly.

Final Solution:

These three lines in httpd.conf need to be commented.

RewriteCond %{REQUEST_FILENAME} .php$
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f
RewriteRule (.*) - [H=text/html]

I suspect they are auto-generated by some Cpanel updated and will try to report this to them.

Thank you

2

Answers


  1. At first you need to make life more clearer and stop further rules execution by [L] option:

    RewriteRule ^products/(.*).php  product.php?page=$1&%{QUERY_STRING} [L]
    

    If doesn’t help – there will be rules before yours quoted one executed with a priority.

    Something with

    RewriteCond %{REQUEST_FILENAME} !-f
    

    condition.
    Check your .htaccess if you have those rules.
    If you control /etc/apache2/ or /etc/httpd/ folder – check root webserver configs for those.
    Otherwise you need to contact your hosting provider.

    Login or Signup to reply.
  2. yshaool I have the exact same problem with you. My search for a solution lead me also to the httpd.conf.
    I commented out the 3 Rewrite lines and restarted Apache. Now it works OK. I’m afraid that this is auto generated file and it will overwritten some time.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search