处理301重定向和URL重写是否有正确的顺序?

时间:2015-03-30 20:39:24

标签: apache .htaccess mod-rewrite redirect url-rewriting

好的,情况是这样的。我有 example.com/old-url.php ,作为一个例子,我最终希望成为 example.com/new-url /

由于我在整个网站上为多个页面执行此操作,因此我首先删除PHP扩展并强制所有请求使用尾随斜杠,如下所示:

RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/(.+)/$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^(.*)/$ $1.php [L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .*[^/]$ $0/ [L,R=301]

对于某些页面,这就是所需要的。对于其他页面,例如我上面的例子,我需要再多做一步。所以我将 old-url.php 重命名为 new-url.php 并创建一个额外的301重定向,如下所示:

Redirect 301 /old-url/ http://www.example.com/new-url/

但这是正确的方法吗?做一些像这样的事情是更好的做法:

Redirect 301 old-url.php http://www.example.com/new-url.php

在URL重写之前简单地放置301?甚至:

Redirect 301 old-url.php http://www.example.com/new-url/

似乎有几种方法我可以设置它,我只是想知道它是否真的重要或哪个是最佳的。

提前致谢。

1 个答案:

答案 0 :(得分:1)

应该在内部路由规则之前保留外部重定向。将mod_rewrite规则与mod_alias规则混合使用也不是一个好主意。

这是正确的顺序:

RewriteRule ^old-url/?$ /new-url/ [L,NC,R=301]

RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule ^(.+?)\.php$ /$1/ [L,R=301]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .*[^/]$ $0/ [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/(.+)/$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^(.*)/$ $1.php [L]