.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-directory
与 RewriteRule ^([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-directory
,RewriteRule ^([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 错误进行排序,然后重新组织您的规则,以免它们发生冲突。您可能会合并它们。合并它们以控制它们的顺序实际上更容易。否则,它们只是级联,它会变得相当复杂。
我需要 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-directory
与 RewriteRule ^([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-directory
,RewriteRule ^([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 错误进行排序,然后重新组织您的规则,以免它们发生冲突。您可能会合并它们。合并它们以控制它们的顺序实际上更容易。否则,它们只是级联,它会变得相当复杂。