重写忽略目录中存在的文件

时间:2011-03-27 02:46:04

标签: mod-rewrite

我一直在成功使用以下重写,需要www.site.com/123/abc将其指向www.site.com/index.php?id=123&page=abc

RewriteEngine On
RewriteRule ^([0-9]+)$ http://%{HTTP_HOST}/$1/ [R,L]
RewriteRule ^([0-9]+)/(.*)$ /index.php?id=$1&page=$2 [L]

直到现在。当一个目录存在并匹配$ 123 www.site.com/123 / / 123 /目录中的文件时我无权访问。如果我尝试将重写更改为以下内容,除文件外,所有内容仍然有效。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([0-9]+)$ http://%{HTTP_HOST}/$1/ [R,L]
RewriteRule ^([0-9]+)/(.*)$ /index.php?id=$1&page=$2 [L]

使用mod重写时会使用什么,而不是忽略目录中的文件。

1 个答案:

答案 0 :(得分:0)

RewriteCond仅适用于下一个RewriteRule。由于你有两个规则,你需要重复你的条件。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([0-9]+)$ http://%{HTTP_HOST}/$1/ [R,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([0-9]+)/(.*)$ /index.php?id=$1&page=$2 [L]

或者您可以在继续重写规则之前过滤掉顶部的文件和目录:

# Do nothing if URL points to existing file or directory.
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule (.*) $1 [L]

RewriteRule ^([0-9]+)$ http://%{HTTP_HOST}/$1/ [R,L]
RewriteRule ^([0-9]+)/(.*)$ /index.php?id=$1&page=$2 [L]