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



好吧,情况是这样的。我有example.com/old-url.php,作为一个例子,我最终想成为sample.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]

对于某些页面,这就是所需的全部内容。对于其他页面,比如我上面的例子,我需要再迈出一步。因此,我将旧的url.php重命名为新的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

只需将301放在URL重写之前?甚至:

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

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

提前谢谢。

应该在内部路由规则之前保留外部重定向。将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]

最新更新