.htaccess 301重定向目录,无法正常工作

时间:2017-04-27 16:51:24

标签: apache .htaccess redirect rewriting

我需要301重定向目录及其包含的重新网址:

/old-directory/any-url.html 301重定向到 /new-directory/any-url.html

/ old-directory / 301重定向到 / new-directory /

在该目录中(移动到/ new-directory),我有这个特定于目录的.htaccess,我需要遵守这些规则:

RewriteEngine On
RewriteRule ^list\.html$            list.php [QSA]
RewriteRule ^(.*)\.html$            index.php?hash=$1 [QSA,L]

也许没有必要指定它,但是在根目录中,我有这个root .htaccess,其规则我不想干涉:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([a-zA-Z0-9-]*)$             index.php?page=$1 [QSA,L]

我尝试在根目录中添加它.htaccess:

RewriteRule ^old-directory$         /new-directory/ [R=301,NC,L]
RewriteRule ^old-directory/(.*)$    /new-directory/$1 [R=301,NC,L]

...但它不起作用(我得到500内部服务器错误)。 你知道为什么吗?由于我在.htaccess测试站点上成功测试了这个规则,我想这是因为它干扰了其他/新目录/特定.htaccess ...在这种情况下,将两个.htaccess合并为一个会更好吗怎么样?

1 个答案:

答案 0 :(得分:0)

此问题是,即使您修正了500错误,您的基本重写规则也始终优先,因为old-directoryRewriteRule ^([a-zA-Z0-9-]*)$匹配,因此请确保订单正确并放置{{1}规则在现有规则之前:

old-directory

您会注意到我也简化了您的规则。没有理由你应该有2行。

不要忘记,一旦重定向到RewriteEngine On RewriteRule ^old-directory(.*)$ /new-directory$1 [R=301,NC,L] RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^([a-zA-Z0-9-]*)$ index.php?page=$1 [QSA,L] new-directory(来自根目录)仍将适用,因此您可能需要将其更改为:

RewriteRule ^([a-zA-Z0-9-]*)$

RewriteCond %{REQUEST_FILENAME}.php -f RewriteCond %{REQUEST_URI} !^new-directory RewriteRule ^([a-zA-Z0-9-]*)$ index.php?page=$1 [QSA,L] 看起来也有点可疑。您可能只需要%{REQUEST_FILENAME}.php

最后,您需要先查看Apache错误日志对500错误进行排序,然后重新组织规则,以免它们发生冲突。你可以合并它们。实际上,将它们合并以控制订单更容易。否则,他们只是级联,它可能变得相当复杂。