.htaccess 301 重定向目录,不工作

.htaccess 301 redirect a directory, not working

我需要 301 重定向目录及其包含的重写 URL:

/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= [QSA,L]

也许没有必要指定它,但在根目录上,我有这个根 .htaccess,其中包含我不想干扰的规则:

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

我试图在根 .htaccess 中添加这个:

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

...但它不起作用(我收到 500 内部服务器错误)。 你知道为什么吗?由于我在 .htaccess 测试站点上成功测试了此规则,我猜这是因为它干扰了另一个 /new-directory/ 特定的 .htaccess ... 在那种情况下,将两个 .htaccess 合并为一个会更好吗,以及如何?

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

RewriteEngine On

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

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

您会注意到我还简化了您的规则。你没有理由为此设置 2 行。

不要忘记,一旦重定向到 new-directoryRewriteRule ^([a-zA-Z0-9-]*)$(从根目录)仍然适用,因此您可能需要将其更改为:

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

%{REQUEST_FILENAME}.php 看起来也有点可疑。你可能只需要 %{REQUEST_FILENAME}

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