mod_rewrite将所有不匹配的规则重定向到公共文件

时间:2011-11-18 04:28:33

标签: apache .htaccess mod-rewrite

我已经设置了所有重写规则并在.htaccess中工作,但我需要将所有不匹配的规则重定向到一个公共位置。

以下是规则:

# add trailing slash    
RewriteCond %{DOCUMENT_ROOT} -d
RewriteRule ^([^.]*[^/])$ $1/ [R]

# redirect directories to old site if it exists    
RewriteCond %{DOCUMENT_ROOT}/old_site/$0 -d
RewriteRule ^(.*) old_site/$1 [NC,QSA,L]

#redirect files to old site if they exist
RewriteCond %{DOCUMENT_ROOT}/old_site/$0 -f
RewriteRule ^(.*) old_site/$1 [NC,QSA,L]

这很好用,但尝试将其余的流量(所有不匹配的规则)重定向到index.php,只是写了上面的所有规则:

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

如果没有别的东西(我猜除了尾部斜线部分)匹配了,我怎么能确保这部分只被执行?

编辑: 根据@Jon Lin,我将最后三行更改为

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php

现在适用于所有内容,但不以斜杠结尾的目录。我不能把[L]放在第一条规则上,因为我需要它进一步重写到另一个目录。

1 个答案:

答案 0 :(得分:1)

该规则永远不会被应用,因为%{REQUEST_FILENAME}永远不会是目录不是同时的目录。如果您希望不重写现有目录和文件(如果链接到图像),请包含以下条件:

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

你的规则很好。但您可能希望在其末尾添加[L]

此外,您拥有的第一条规则是检查文档根是否是目录(它应该),这意味着将始终应用规则,这意味着/index.php将被重写为{{ 1}}。我想你可能正在寻找%{REQUEST_FILENAME}而不是%{DOCUMENT_ROOT}。