【发布时间】:2019-04-05 09:53:36
【问题描述】:
我的 htaccess 使用了多年的命令,如下所示:
RewriteRule ^products/(.*).php product.php?page=$1&%{QUERY_STRING}
映射 products 文件夹下的所有项目以使用 product.php 文件提供服务
今天,突然所有的 URL 都开始给出 404。经过数小时的挖掘,我发现该命令现在只有在 products 文件夹下有一个实际文件(甚至是空文件 - 没关系)时才有效。例如,products/p1.php 仅当 p1.php 位于 products 文件夹下时才有效。
我还运行了一个测试并添加了:
RewriteRule ^tests/(.*).php tests/index.php
还有一个 index.php 文件,位于测试文件夹下,带有 hello world。它仅适用于实际在测试文件夹中的文件。只有在tests文件夹中有testing.php文件时,tests/testing.php才会显示index.php的内容。
是否有人知道在服务器配置中可能发生了什么变化导致这种情况,或者是否有办法修复我的命令以在 URL 位置没有实际文件的情况下工作?
2018 年 11 月 1 日编辑:
我在 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>
可能是这个原因吗?
另一个更新:
所以这一行
RewriteRule ^tests/(.*) tests/index.php
适用于现有文件和不存在的目录。 所以 tests/dir1/ 会很好地重定向。但是 test/file.php 只有在 file.php 实际存在时才会重定向。
还有一个更新(抱歉,我正在调试它并找到我们更多的东西):
重定向只会对 PHP 文件失败!所有其他文件都将正常工作。
最终解决方案:
httpd.conf 中的这三行需要注释。
RewriteCond %{REQUEST_FILENAME} \.php$
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f
RewriteRule (.*) - [H=text/html]
我怀疑它们是由某些更新的 Cpanel 自动生成的,并会尝试向他们报告。
谢谢
【问题讨论】:
-
尝试禁用 MultiViews 是否有帮助。在 URL 路径和文件名之间存在“重叠”的情况下,这通常是罪魁祸首。 (在这里谈论
products/和实际存在的products.php。) -
禁用多视图没有效果。
-
httpd.conf 中的内容使 PHP 文件通过 PHP 7.0 FPM 处理程序发送,并且以下重写似乎明确提出以 .php 结尾的请求与现有文件不匹配,之后传递给 text/html “处理程序”(这可能只是意味着不处理。)如果您可以更改 httpd.conf,请尝试删除最后的条件和规则。 (相应地,将它们注释掉,看看会发生什么。)
-
确实是这三行问题
标签: apache .htaccess url configuration mapping