【问题标题】:.htaccess throwing 404 with with letter P in RewriteRule.htaccess 在 RewriteRule 中抛出带有字母 P 的 404
【发布时间】:2018-11-16 18:35:55
【问题描述】:

这条规则非常有效:

RewriteCond %{HTTP_HOST} ^(.*)\.[a-z0-9\-]{3,}\..*
RewriteRule ^t/(.*)$ /p.php?p=$1 [L]

这条几乎相同的规则会抛出 404:

RewriteCond %{HTTP_HOST} ^(.*)\.[a-z0-9\-]{3,}\..*
RewriteRule ^p/(.*)$ /p.php?p=$1 [L]

会不会有一些 apache 或 DNS 规则破坏了这一点?我在旧服务器上有相同的 .htaccess 文件,它工作正常。新服务器是 CentOS7 和 PHP7。

【问题讨论】:

  • 你的网络服务器上有p/吗?如果您不这样做,那么这确实是您描述的行为会发生的唯一合乎逻辑的原因。
  • 你可以在RewriteEngine On 行之前添加Options -MultiViews 并重新测试这两个规则。
  • 我不确定如何或为什么,但这似乎效果很好!你能在答案中解释一下吗?

标签: php regex apache .htaccess


【解决方案1】:

从我的 cmets 可以看出,您默认打开了 MultiViews 选项。

您可以通过将此行放在 .htaccess 顶部来关闭它:

Options -MultiViews

选项MultiViews(参见http://httpd.apache.org/docs/2.4/content-negotiation.html)由运行before mod_rewrite 模块的Apache's content negotiation module 使用,并使Apache 服务器匹配文件的扩展名。在使用mod_rewrite 规则时最好将其关闭以避免此类意外行为。

例如/file 是 URI,文件名 file.php 存在于您的文档根目录中,然后 Apache 可能会找到匹配的文件并提供它而不是匹配您的规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2023-03-03
    • 2015-07-18
    • 2015-06-25
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多