我已经设置了所有重写规则并在.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]放在第一条规则上,因为我需要它进一步重写到另一个目录。
答案 0 :(得分:1)
该规则永远不会被应用,因为%{REQUEST_FILENAME}永远不会是目录而不是同时的目录。如果您希望不重写现有目录和文件(如果链接到图像),请包含以下条件:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
你的规则很好。但您可能希望在其末尾添加[L]
。
此外,您拥有的第一条规则是检查文档根是否是目录(它应该),这意味着将始终应用规则,这意味着/index.php
将被重写为{{ 1}}。我想你可能正在寻找%{REQUEST_FILENAME}而不是%{DOCUMENT_ROOT}。