我想测试文件是否位于底部的两个规则中,但似乎仅适用于第一个规则。第二条规则会错误地匹配我的/style.css文件,并显示php页面而不是style.css。
不是应该测试所有下一个规则的文件是否存在,直到[L]
标志吗?
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/?$ browse_folder.php?username=$1&folder=$2
RewriteRule ^([^/]+)/?$ browse_user.php?username=$1 [L]
如果我在两行中的每一行之前都重复file_exists测试,它将按预期工作。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/?$ browse_folder.php?username=$1&folder=$2
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ browse_user.php?username=$1 [L]
答案 0 :(得分:3)
不是应该测试所有下一个规则的文件是否存在,直到 [L]标志?
不,不是。 RewriteCond
应用于仅倒数第二个RewriteRule
。来自official documentation:
RewriteCond指令定义规则条件。一个或多个 RewriteCond可以在RewriteRule指令之前。以下规则是 然后仅在URI的当前状态与它的当前状态都匹配时才使用 模式,以及是否满足这些条件。
请注意can precede
a RewriteRule
如果您不想重复自己,可以按照以下步骤操作:
RewriteEngine On
# Don't touch existing files/folders
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
# Those rules are only applied to non-existing files/folders
RewriteRule ^([^/]+)/([^/]+)/?$ browse_folder.php?username=$1&folder=$2
RewriteRule ^([^/]+)/?$ browse_user.php?username=$1 [L]
答案 1 :(得分:2)
RewriteCond
仅适用于下一个RewriteRule
。您可以单独制定一条规则,以跳过其他重写规则之上的所有文件和目录。
RewriteEngine On
# skip all existing files and directories
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteRule ^([^/]+)/([^/]+)/?$ browse_folder.php?username=$1&folder=$2 [L,QSA]
RewriteRule ^([^/]+)/?$ browse_user.php?username=$1 [L,QSA]