我想测试下面两个规则的文件是否都存在,但它似乎只适用于第一个规则。第二条规则将错误地匹配我的/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]发布于 2018-08-01 18:18:39
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]发布于 2018-08-01 18:16:50
不是应该在L标志之前测试所有后续规则的文件是否存在吗?
不,不是的。RewriteCond仅应用于第一个-下一个RewriteRule。从official documentation
RewriteCond指令定义规则条件。RewriteRule指令之前可以有一个或多个RewriteCond。然后,仅当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]https://stackoverflow.com/questions/51630503
复制相似问题