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

Mod rewrite 重写忽略目录中存在的文件,mod-rewrite,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] 直到现在。当存在一个目录并与$1 www.site.com/123/匹配时,/123

我已经成功地使用了以下重写,将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]
直到现在。当存在一个目录并与$1 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 rewrite,而不忽略目录中的文件。

RewriteCond
s仅适用于下一个
重写规则。因为你有两条规则,你需要重复你的条件

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]

现在我不知道了。然而,我尝试了它,当它存在时,我可以从目录中提取图像-不幸的是,它打破了重写规则^([0-9]+)/(.*)$/index.php?id=$1&page=$2,它使用所有脚本绘制文件。让我试着这样解释我的场景。我有一个URL site.com/123/没有mod rewrite指向site.com/index.php的目录123?id=123新方案开始发挥作用,我现在有一个URL,如site.com/456/还有一个目录,它叫做456。此目录中没有php脚本,只有MP3和图像。这意味着我仍然需要mod rewrite指向site.com/index.php?id=456,如上所述,但在index.php加载时仍然可以访问这些文件——现在它没有。这就是我被困的地方。让我试着用这种方式解释我的情况。我有一个URL site.com/123/没有mod rewrite指向site.com/index.php的目录123?id=123新方案开始发挥作用,我现在有一个URL,如site.com/456/还有一个目录,它叫做456。此目录中没有php脚本,只有MP3和图像。这意味着我仍然需要mod rewrite指向site.com/index.php?id=456,如上所述,但在index.php加载时仍然可以访问这些文件——现在它没有。这就是我被困的地方