Apache mod_rewrite'love'/ Last不起作用

时间:2015-03-24 23:06:44

标签: apache .htaccess mod-rewrite

我有以下的重写规则,但除了我上一次重写之外的所有规则都已停止工作。

文件夹结构类似于:

/
/site
/console
/requests

如果我转到http://xx.com/contact,它实际上是在向我展示http://xx.com/site/contact。这很好用。但是,如果我转到http://xx.com/console,这将无效。我相信这与我的最终统治接管有关,但我看不出如何。基本上,当我去http://xx.com/console时,它应该带我去http://xx.com/console,但是,我相信它正试图把我带到http://xx.com/site/console,这是不存在的!

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www.)?xx.org.uk$

RewriteRule ^wp-content/uploads/2012/05/banner.png$ http://xx.org.uk/site/wp-content/uploads/2012/05/banner.png [L,R=301]
RewriteRule ^questions(.*)$ http://xx.org.uk/questions/ [L,R=301]
RewriteRule ^survey(.*)$ http://xx.org.uk/xx-2014-survey/ [L,R=301]

RewriteRule ^console/([^/.]+)$ http://xx.org.uk/console/?id=$1 [L,R=301]
RewriteRule ^requests/([^/.]+)$ http://xx.org.uk/requests/?id=$1 [L,R=301]

RewriteCond %{REQUEST_URI} !^/site/
RewriteRule ^(.*)$ /site/$1 [L,NC]

2 个答案:

答案 0 :(得分:1)

L并不像END那样结束规则执行,但END仅适用于Apache 2.4+。 L只会以现有规则结束。

对于之前的Apache版本,将您的上一条规则调整为:

RewriteCond %{REQUEST_URI} !^/(site|questions|console|requests|xx-2014-survey)/ [NC]
RewriteRule ^(.*)$ /site/$1 [L,NC]

答案 1 :(得分:1)

因为除了你的上一个规则之外的所有规则都有[R]标志(用于测试?),它们将导致浏览器加载一个新的URL,并且将向Apache提出一个有竞争力的新请求。

由于此请求与任何其他规则都不匹配,并且不包含/ site /,因此它将与最后一条规则匹配。

[L]标志或任何其他标志无法阻止这种情况,因为Apache无法知道此新请求是先前规则的结果,也没有人直接在浏览器中输入新URL。 / p>