Php 请求文件名的奇怪行为?
我使用的是MAMP,基于虚拟主机的设置创建了一个“.dev”tld用于工作。 我的站点的.htaccess使用mod_重写,如下所示:Php 请求文件名的奇怪行为?,php,apache,.htaccess,mod-rewrite,Php,Apache,.htaccess,Mod Rewrite,我使用的是MAMP,基于虚拟主机的设置创建了一个“.dev”tld用于工作。 我的站点的.htaccess使用mod_重写,如下所示: RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [L] Rewrite
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]
RewriteRule ^(butchers|news|recipes)/([a-zA-Z0-9-/]+)$ /$1.php?s=$2 [L,QSA]
我的网站以肉店目录为特色。列表视图由butchers.php显示,可在butchers
访问。详细视图由butchers.php?s=some butcher name
显示,可访问butchers/some butcher name
。
正如您所看到的,同样的机制也适用于新闻和食谱部分
好吧,事情是这样的:这过去是有效的。它工作得很好,然后我在升级MAMP后重新启动了我的系统,现在它给了我一个内部服务器错误。我假设我已经从Apache1.x升级到了2.x;升级后,我不得不重做vhost配置,但其他一切都很普通(和上次一样),只是我禁用了多视图
。mod_重写日志如下所示(前几列被截断)
以下是我对正在发生的事情的理解:
- 我的行动单位要求
屠夫/示例屠夫
- 当RewriteCond中使用请求\u文件名时,它输出的路径仅包含
屠夫
,而不是屠夫/示例屠夫
- 这不会发生,因为
butchers.php
是真实的
- 根据重写规则,允许重写附加“.php”
- 当它追加时,它将其追加到原始请求,
butchers/example butcher
- 内部重定向使用
butchers/example butcher.php重新启动循环
然后,这个过程再次以同样的问题开始——RewriteCond测试这个奇怪的、不完整的路径版本,但在正确的路径上运行。这种情况发生了十次,在apache达到极限并发出500次警告之前,积累了越来越多的.php
- 请求<代码>屠夫/示例屠夫
butchers.php
是真正的文件吗?对!李>
.php
butchers/example butcher.php
butchers.php
是真正的文件吗?对!李>
.php
butchers/example butcher.php.php
.php
,我只是不明白为什么REQUEST\u FILENAME只给出路径的第一级。我找不到任何文件表明这是规定的行为
有什么想法吗?我已经为此浪费了整整一个工作日:/
谢谢 这是因为
%{REQUEST\u FILENAME}
变量不仅仅是映射到单个文件/目录的请求URI。当您有如下请求时:
/foo/bar/something
您有以下任一文件:
/foo.php
/foo/bar.php
/foo/bar/something.php
条件:
RewriteCond %{REQUEST_FILENAME}.php -f
将为真,因为mod_rewrite也会考虑路径信息。如果您有其中一个php文件,那么mod_rewrite将尝试巧妙地找出请求的URI是否实际位于请求的URI路径中,并将.php
添加到该路径节点,而不是添加到最后。要严格检查请求+.php
是否存在,您需要执行以下操作:
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f