URL重写:规则结束

时间:2013-11-09 09:08:01

标签: mod-rewrite url-rewriting

我对此网址重写规则有疑问。

为什么规则3而不是1?

我想将请求从/ Test / *重定向到此目录=> /测试/ *


     RewriteEngine on
     1 RewriteRule    ^Test/(.*)$ Tests/$1 [L]
     2 RewriteRule    ^$ App/web/    [L]
     3 RewriteRule    (.*) App/web/$1 [L]

1 个答案:

答案 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,例如。

运行perdir RewriteEngine:

规则1会将其重写为/Tests/ObjectTest.php。

运行2 perdir RewriteEngine:

当URI发生变化时,它会重新启动处理/.htaccess。在此次运行中,规则1不再匹配,规则2也不匹配。但是规则3将匹配,因为(。*)匹配任何URL,这里是Tests / ObjectTest.php。 我们得到/App/web/Tests/ObjectTest.php。

perdir RewriteEngine的运行3:

随着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

enter image description here