【问题标题】:Htaccess RewriteRule for maping urls to be served from one fileHtaccess RewriteRule 用于映射要从一个文件提供的 url
【发布时间】: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


【解决方案1】:

首先你需要通过 [L] 选项让生活更清晰并停止进一步的规则执行:

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

如果没有帮助 - 在您引用的规则被优先执行之前会有规则。

有关的东西
RewriteCond %{REQUEST_FILENAME} !-f

条件。 如果您有这些规则,请检查您的 .htaccess。 如果您控制 /etc/apache2//etc/httpd/ 文件夹 - 请检查这些根网络服务器配置。 否则,您需要联系您的托管服务提供商。

【讨论】:

  • 我试过 [L]。它没有帮助。我已经用我在服务器 httpd.conf 上找到的东西更新了我的问题。可以看看吗?
【解决方案2】:

yshaool 我跟你有同样的问题。我对解决方案的搜索也将我带到了 httpd.conf。 我注释掉了 3 Rewrite 行并重新启动了 Apache。现在它工作正常。恐怕这是自动生成的文件,它会覆盖一段时间。

【讨论】:

  • 是的,这就是问题所在。它由 Cpanel 生成,我正在与我的托管公司合作向 Cpanel 报告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 2022-12-23
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
相关资源
最近更新 更多