我有以下的重写规则,但除了我上一次重写之外的所有规则都已停止工作。
文件夹结构类似于:
/
/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]
答案 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>