.htaccess在RewriteRule

时间:2018-11-16 18:35:56

标签: php regex apache .htaccess

此规则非常有效:

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文件,并且工作正常。新服务器是带有PHP7的CentOS7。

1 个答案:

答案 0 :(得分:0)

从我的评论中可以明显看出,默认情况下您已启用MultiViews选项。

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

Options -MultiViews

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

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