0

我需要 301 重定向一个目录及其包含的 rewitten 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=$1 [QSA,L]

也许没有必要指定,但是在根目录上,我有这个根 .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 测试站点上成功测试了此规则,我猜是因为它干扰了另一个 /new-directory/ 特定的 .htaccess ... 在这种情况下,将两个 .htaccess 合并为一个会更好吗?如何?

4

1 回答 1

0

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

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]

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

不要忘记,一旦重定向到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看起来也有点可疑。你可能只需要%{REQUEST_FILENAME}

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

于 2017-04-27T23:57:43.373 回答