假设我有两条重写规则,我想通知浏览器:
http://www.example.org
至http://example.org
)http://example.org/index.php
至http://example.org
)我想同时应用这两个规则,并且我希望这两个规则都能导致301重定向。如果两个规则都匹配,我希望只有一个301重定向。
问题是,当规则有[R]
标志时,我还必须根据Apache documentation指定[L]
(最后)标志。
您几乎总是希望将[R]与[L]结合使用(即使用[R,L]),因为[R]标志本身会在http://thishost[:thisport]前面加上URI,但随后将其传递给规则集中的下一个规则,这通常会导致请求中的“无效URI”。警告。
是否有任何变通办法,以便我可以让两个规则都不会导致2次重定向?
RewriteEngine On
# Naked domains
RewriteRule ^/?(.*)$ http://example.org/$1 [R=301,L]
# Remove index.php
RewriteRule ^index.php/(.*)$ /$1 [R=301,L]
答案 0 :(得分:0)
不,L标志是告诉重写过程停止处理可能遵循这些重写的新重写,但由于您正在进行外部重定向,我怀疑没有它会导致问题。不过,真正的问题是你为什么使用mod_rewrite(或.htaccess)就是这么简单(当没有更简单的选项时应该保留mod_rewrite)。
这是正确的方法(没有mod_rewrite)。
#NameVirtualhost *:80 <- add and uncomment this only if your version is 2.2
<Virtualhost *:80>
ServerName example.org
DocumentRoot /path/to/your/htdocs
RedirectMatch 301 ^/index.php/(.*) /$1
#other config
</Virtualhost>
<Virtualhost *:80>
ServerName www.example.org
Redirect 301 / http://example.org/
</Virtualhost>
答案 1 :(得分:0)
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^.* - [E=A:http://%1]
RewriteCond %{REQUEST_URI} ^/index.php
RewriteRule ^index.php - [E=B:/]
RewriteCond %{ENV:A} .+
RewriteCond %{ENV:B} ^$
RewriteRule ^(.*) - [E=B:/$1]
RewriteCond %{ENV:A} .+ [OR]
RewriteCond %{ENV:B} .+
RewriteRule .* %{ENV:A}%{ENV:B} [R=301,L]