RewriteCond作用域

时间:2018-08-01 10:02:31

标签: apache .htaccess mod-rewrite url-rewriting

我想测试文件是否位于底部的两个规则中,但似乎仅适用于第一个规则。第二条规则会错误地匹配我的/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]

2 个答案:

答案 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]