我们正在更新我们的网站(example.co.uk),其中一部分涉及在 .htaccess 文件中设置从旧网站的 301 重定向 — — 这很好而且很简单。
旧网站有一个区域使用子域名(xyz.example.co.uk),该子域名指向第三方平台。
新网站现在整合了该区域(在几个不同的页面上),因此不再需要子域名。为了获得最佳实践并保留现有链接中的任何 SEO 汁液,最佳做法是什么?我花了几个小时在网上寻找答案,但找不到任何让我有信心实施的东西。
从 SEO 的角度来看,我们理想情况下希望对旧页面进行 301 重定向,如下所示: https://xyz.example.co.uk/page1到https://example.co.uk/page2 https://xyz.example.co.uk/page2/page3到https://example.co.uk/page4/page5 等等...但是,我知道将这些放在.htaccess 文件(在主域服务器上)中是行不通的,因为我们正尝试从子域转到域?
首先,我们还需要子域名的 DNS 条目吗?还是必须保留它?子域名当前是 CNAME,但我可以将其更改为 A 记录并指向与主域名相同的 IP 吗?
我考虑过很多选择(仅供参考,托管在 Cloudways — Digital Ocean 并且 DNS 通过 CloudFlare 管理):
A) 不用担心页面到 301 页面的重定向,而是在主域 .htaccess 中添加以下内容:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^xyz.example.co.uk$
RewriteRule ^(.*)$ https://example.co.uk/page/ [R=301,L]
但这对 SEO 有害吗?
B) 对重定向不做任何操作,仅使用 A 记录将子域名指向主域名,然后对 SEO 造成影响。
C)在 Cloudflare 中设置页面规则并转发https://xyz.example.co.uk/* 到https://example.co.uk/page— 在这种情况下,我认为我需要保留子域 DNS 条目?但是,是否应该将其更改为 A 记录并指向主域服务器 IP?
我想我现在已经够困惑了,所以任何帮助我都会非常感激,谢谢。
答案1
对于 SEO 来说,最好的选择是将子域名 URL 301 重定向到新 URL。
您需要有一个 DNS 条目,xyz.example.co.uk
以便人们可以解析服务器的 IP 地址。
然后,您需要在该 IP 地址上运行 HTTP 服务器来提供所需的重定向。对于您来说,它可以是您当前用于主站点的同一台服务器(前提是托管服务提供商支持子域设置)。
在 HTTP 服务器中,您需要为 定义一个虚拟服务器xyz.example.co.uk
,其中将包含您想要使用的重定向规则。
您还需要确保https://xyz.example.co.uk
已安装有效的 TLS 证书。
答案2
SEO 优化更多是网站管理员 SE问答网站。
技术上:
首先,我们还需要子域名的 DNS 条目吗?
你需要A子域的 DNS 条目xyz.example.co.uk
必须保留,以便任何类型的重定向都能够存在。如果没有该 DNS 条目,对 xyz.example.com 的任何请求都将失败,并出现“主机未找到”或类似的 DNS 错误...
为了在 Web 浏览器中进行重定向,需要在xyz.example.co.uk
将子域指向的任何主机上运行 Web 服务器。
如果您有 HSTS 策略和/或旧子域名也可在 HTTPS 上使用,您也需要为该 Web 服务器配置有效的 SSL 证书xyz.example.co.uk
。
如果您将xyz.example.co.uk
子域名指向与主网站使用的同一 Web 服务器(例如使用 CNAME 记录),则您有两个选择:
xyz.example.co.uk
您专门为(我推荐的解决方案,因为这可以使配置保持良好和独立)创建一个额外的“VirtualHost”条目xyz.example.co.uk
您处理现有网站中的请求www.example.com
。然后:- 要么您不做任何特殊处理,然后
http://xyz.example.co.uk
将显示http://www.example.com
索引页,并且请求http://xyz.example.co.uk/page2/page3
将显示该页面http://www.example.co.uk/page2/page3
(如果存在)或 404 错误页面(如果不存在)。 - 或者,您可以配置重写规则,当
xyz.example.co.uk
用于访问您的网站时触发该规则,并执行您也可以从单独的 VirtualHost 执行的那种重定向
- 要么您不做任何特殊处理,然后
Apache 风格中最简单的配置(因为你正在谈论令人厌恶的文件.htaccess
)使用Redirect
指令将重写对或http://
的https://xyz.example.com/service/foo.txt
请求https://www.example.com/service/foo.txt
:
# existing VirtualHost for www.example.com
<VirtualHost *:80>
Servername www.example.com
...
</VirtualHost>
<VirtualHost *:443>
Servername www.example.com
SSLCertificateFile "/etc/apache2/conf/ssl/www.example.com.crt"
SSLCertificateKeyFile "/etc/apache2/conf/ssl/www.example.com.key"
...
</VirtualHost>
# new minimal VirtualHost entries for xyz.example.co.uk
<VirtualHost *:80>
Servername xyz.example.com
Redirect "/" "https://www.example.com/"
</VirtualHost>
<VirtualHost *:443>
Servername xyz.example.com
SSLCertificateFile "/etc/apache2/conf/ssl/xyz.example.com.crt"
SSLCertificateKeyFile "/etc/apache2/conf/ssl/xyz.example.com.key"
Redirect "/" "https://www.example.com/"
</VirtualHost>
始终使用临时重定向开始测试您的重定向,因为永久重定向会被您的浏览器缓存,这会使纠正任何错误变得困难。
由于您已经提到在某些位置找不到旧子域的内容,因此Redirect
上述指令可能不是最佳解决方案。
相反,你可以选择将所有旧 URI 重定向到单个登录页面(解释 XYZ 已被弃用,请使用此站点地图浏览新站点)。RedirectMatch
指示:
# new minimal VirtualHost entries for xyz.example.co.uk
<VirtualHost *:80>
Servername xyz.example.com
RedirectMatch "*" "https://www.example.com/xyz-is-deprecated.html"
</VirtualHost>
<VirtualHost *:443>
Servername xyz.example.com
SSLCertificateFile "/etc/apache2/conf/ssl/xyz.example.com.crt"
SSLCertificateKeyFile "/etcl/apache2/conf/ssl/xyz.example.com.key"
RedirectMatch "*" "https://www.example.com/xyz-is-deprecated.html"
</VirtualHost>
最耗费人力的是将 xyz 子域上的每个旧页面映射到主网站上的新页面。例如,可以使用RewriteMap
指示。
最简单的映射是将旧 URI 路径映射到新 URI 路径的文本文件,例如映射文件:/etc/apache2/xyz-to-www.txt
##
## xyz-to-www.txt - Map old URI's from xyz.example.com to
## corresponding URI's on www.example.com
##
/ /xyz-is-deprecated.html
/page1 /page2
/page2/page3 /page4/page5
然后这将映射http(s)://xyz.example.co.uk/page1
到https://www.example.co.uk/page2
,任何未映射的内容都将被重定向到页面https://www.example.com/yz-is-deprecated.html
:
# new minimal VirtualHost entries for xyz.example.co.uk
<VirtualHost *:80>
Servername xyz.example.com
RewriteMap xyz-to-www "txt:/etc/apache2/xyz-to-www.txt"
RewriteRule "(.*)" "https://www.example.com${xyz-to-www:$1}" [R]
</VirtualHost>
<VirtualHost *:443>
Servername xyz.example.com
SSLCertificateFile "/etc/apache2/conf/ssl/xyz.example.com.crt"
SSLCertificateKeyFile "/etcl/apache2/conf/ssl/xyz.example.com.key"
RewriteMap xyz-to-www "txt:/etc/apache2/xyz-to-www.txt"
RewriteRule "(.*)" "https://www.example.com${xyz-to-www:$1|/xyz-is-deprecated.html}" [R]
</VirtualHost>
注意:以上所有内容均未经测试,仅用于说明概念。