我对此网址重写规则有疑问。
为什么规则3而不是1?
我想将请求从/ Test / *重定向到此目录=> /测试/ *
RewriteEngine on 1 RewriteRule ^Test/(.*)$ Tests/$1 [L] 2 RewriteRule ^$ App/web/ [L] 3 RewriteRule (.*) App/web/$1 [L]
答案 0 :(得分:0)
实际上apache RewriteEngine忽略了所有文件的存在,但只修改了URI。它仅在整个.htaccess处理期间URI未更改时结束。
使用/.htaccess中的一组规则:
RewriteEngine On
RewriteRule ^Test/(.*)$ Tests/$1 [L]
RewriteRule ^$ App/web/ [L]
RewriteRule (.*) App/web/$1 [L]
我们会查询查询网址http://www.example.com/Test/ObjectTest.php,例如。
规则1会将其重写为/Tests/ObjectTest.php。
当URI发生变化时,它会重新启动处理/.htaccess。在此次运行中,规则1不再匹配,规则2也不匹配。但是规则3将匹配,因为(。*)匹配任何URL,这里是Tests / ObjectTest.php。 我们得到/App/web/Tests/ObjectTest.php。
随着URI的改变,它再次重新开始/.htaccess。它再次匹配规则3,我们得到/App/web/App/web/Tests/ObjectTest.php。
我们有一个无限循环。
标志[L]忽略此标志后面的所有指令,但不会忽略整个重写过程。
要解决这个问题,我们必须添加RewriteCond:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^Test/(.*)$ Tests/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^$ App/web/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) App/web/$1 [L]
请参阅Reference。