我有一个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
我知道我可以花一个下午思考并将规则排序为更好的匹配,并且我可以创建组合规则。但这会使已经很长的文件复杂化。我想要一个标志,操作数或任何可以执行所有规则的内容,就像它们在内部一样,只有在爬行每个规则后才发出重定向。这甚至可能吗?
答案 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.php
或http://www.example.com/index.php
的请求将导致单个重定向:
http://www.example.com/
与其他任何内容都不匹配的请求将导致单个重定向:
http://example.com/foo
要:
http://www.example.com/foo
这似乎涵盖了所有基础。我错过了什么吗?
答案 1 :(得分:0)
从[L]
中删除RewriteRule
标记,它们将自动合并。