我正在重构一个网站,其中有大量内容目前停在像这样的 URL 上。

http://string.domain.com/year/month/dd/string-pulled-from-title

出于各种原因,我想将所有新内容存放在如下所示的 URL 中

http://www.domain.com/blogs/string/year/month/dd/string-pulled-from-title

我想对 future 的内容进行更改,但不希望所有旧内容都变成 404。

我相信我的 htaccess 中的 301 重定向规则可以解决问题,将所有引用的流量通过旧链接发送到新格式。

但是这条规则应该是什么样子的呢?我已经阅读了一些教程,但在任何示例中都没有找到这种确切的情况。

请注意,我不想对所有子域执行此操作,仅对大约 10 个特定子域执行此操作。因此,如果有人可以帮助我找出其中之一,那么我可以将其复制粘贴到每个子域的 htaccess 中 10 次并进行设置。

最佳答案

将其放入旧站点的 .htaccess 文件中(将域调整为您的实际域):

RewriteEngine On
RewriteRule ^(.*)$ http://example.com/blogs/string/$1 [R=301]

这将在旧站点上获取 URL 的这一部分:
year/month/dd/string-pulled-from-title

并将其重定向到新位置下的新站点:
blogs/string/year/month/dd/string-pulled-from-title

或者,如果您想要一些更可变的东西,而不必自定义修复每个 .htaccess ,请将其放入每个子域的文件中:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.*).example.com
RewriteRule ^(.*)$ http://example.com/blogs/%1/$1 [R=301,L]

如果您重定向到同一个域,并且它包含 www ,请将重写规则调整为以下内容:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.*).example.com
RewriteCond %{HTTP_HOST} !^www.example.com [NC]
RewriteRule ^(.*)$ http://example.com/blogs/%1/$1 [R=301,L]

请注意第二个 RewriteCond,它检查以确保请求的 URL 包含前导 www ,如果目标 URL 本身包含 www 并且会尝试重定向该子域,这可能会导致无限重定向。
  • %1 grabs the first capture group from the line above
  • $1 引用同一行上的第一个捕获组。
  • 关于.htaccess - htaccess 重定向子域-> 类似命名的子目录?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1244076/

    10-13 09:35