好的,情况是这样的。我有 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/
似乎有几种方法我可以设置它,我只是想知道它是否真的重要或哪个是最佳的。
提前致谢。
答案 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]