如何结合Apache重定向?

时间:2012-12-06 00:52:53

标签: apache mod-rewrite redirect url-rewriting

我有一个Apache配置,它具有多个重写规则和重定向,以获得最可爱的URL,防止重复搜索引擎优化等。这里有一个片段作为示例(它具有更多功能):

# Redirecting non-www to www 
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

# Removing index.php
RewriteCond %{REQUEST_URI} index\.php$ [NC]
RewriteRule .* / [R=301,L]

# A big bunch of these
Redirect permanent /old-article.html  http://www.example.com/new-article.html
Redirect permanent /another-old-article.html  http://www.example.com/new-article2.html

这很好用,但它恰好产生了很多重定向。一个常见的案例如下:

http://example.com/index.php, 301 redirect to http://www.example.com/index.php
http://www.example.com/index.php, 301 redirect to http://www.example.com

它有时会达到4-5个重定向。

现在,我希望将所有这些规则链接起来,并且只生成一个301重定向,如下所示:

http://example.com/index.php, 301 redirect to http://www.example.com

我知道我可以花一个下午思考并将规则排序为更好的匹配,并且我可以创建组合规则。但这会使已经很长的文件复杂化。我想要一个标志,操作数或任何可以执行所有规则的内容,就像它们在内部一样,只有在爬行每个规则后才发出重定向。这甚至可能吗?

2 个答案:

答案 0 :(得分:0)

似乎只需重新订购就可以得到你想要的东西:

# A big bunch of these
Redirect permanent /old-article.html  http://www.example.com/new-article.html
Redirect permanent /another-old-article.html  http://www.example.com/new-article2.html

# Removing index.php
RewriteRule ^/index.php http://www.example.com/ [R=301,L]

# Redirecting non-www to www 
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

直接请求example.com域中的旧文章:

http://example.com/old-article.html

将导致单个重定向:

http://www.example.com/new-article.html

http://example.com/index.phphttp://www.example.com/index.php的请求将导致单个重定向:

http://www.example.com/

与其他任何内容都不匹配的请求将导致单个重定向:

http://example.com/foo

要:

http://www.example.com/foo

这似乎涵盖了所有基础。我错过了什么吗?

答案 1 :(得分:0)

[L]中删除RewriteRule标记,它们将自动合并。