mod_rewrite重写文件,即使它不应该存在

时间:2014-04-17 10:21:30

标签: php apache .htaccess mod-rewrite redirect

我有以下.htaccess文件,这会产生一种奇怪的行为。

DirectoryIndex index.php index.html
AddCharset UTF-8 .html
AddCharset UTF-8 .php
AddCharset UTF-8 .css
AddCharset UTF-8 .js

AddType image/svg+xml svg

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /Hunpony/

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(.*)\/$ $1 [R=301] # Remove trailing slash
RewriteRule ^$ do.php?do=news [QSA] # Default page
RewriteRule ^([\wáéíóöőúüű.]+|-?\d+)(?:\/((?:[\wáéíóöőúüű]+|-?\d+)(?:\/(?:[\wáéíóöőúüű]+|-?\d+))?))?\/?$ do.php?do=$1&data=$2 [NC,L,QSA]
</IfModule>

ErrorDocument 404 /Hunpony/404

我认为如果请求的文件存在,那些RewriteCond会阻止Apache执行重写,但似乎并非如此。

此文件放在我的服务器的/Hunpony/子文件夹中,与do.php一起处理页面请求。以下是重定向的工作原理示例:它将/Hunpony/profile/1/setings重定向到/Hunpony/do.php?do=profile&data=1/settings。问题是我还希望在第一场比赛中允许点,因此/Hunpony/f.a.q会被重定向到/Hunpony/do.php?do=f.a.q&data=

我面临的问题是,由于某些奇怪的原因,该网站的网站图标(/Hunpony/favicon.ico)正在返回404错误,尽管它已经链接到了哪里&# #39;应该是。

我能想到的唯一可能的解释是Apache将/Hunpony/favicon.ico重写为/Hunpony/do.php?do=favicon.ico&data=,即使该文件存在于服务器上,并且因为在do.php中没有对于名为favicon.ico的页面的特殊情况,它默认为404错误页面。页面的其他资源不受此影响,因为它们位于名称中没有点的子目录下。

1 个答案:

答案 0 :(得分:1)

这是因为RewriteCond仅适用于下一个RewriteRule。您可以遵守以下规则:

DirectoryIndex index.php index.html
AddCharset UTF-8 .html
AddCharset UTF-8 .php
AddCharset UTF-8 .css
AddCharset UTF-8 .js

AddType image/svg+xml svg
ErrorDocument 404 /Hunpony/404
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /Hunpony/

RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^ - [L]

RewriteRule ^(.+?)/$ $1 [L,R=301]

RewriteRule ^$ do.php?do=news [QSA,L]

RewriteRule ^([\wáéíóöőúüű.]+|-?\d+)(?:\/((?:[\wáéíóöőúüű]+|-?\d+)(?:\/(?:[\wáéíóöőúüű]+|-?\d+))?))?\/?$ do.php?do=$1&data=$2 [NC,L,QSA]
</IfModule>