执行 301 重定向的最佳方式是什么(针对整个域以及特定页面/目录)?使用 Apache 虚拟块、.htaccess 还是其他解决方案?
对我来说,“最佳”可能意味着最快和最适合 SEO 的选项,但也许还有其他重要因素(安全性、更易于配置和维护......)。
现在我正在使用 Apache,但是例如对于 https 显然总是在重定向到新域之前检查旧域的证书,所以也许有更快的解决方案?(我对这个问题不太了解,只是问问)
谢谢!
答案1
基本上,重定向有几个选项,但我认为没有最好的方法,这取决于使用情况。
重定向的放置
虚拟主机
先决条件:您需要具有虚拟主机配置的管理权限。
如果旧域名没有任何内容,需要完全重定向,则变体虚拟主机建议这样做,因为DocumentRoot
对于域来说没有必要存在,因此文件系统中没有目录,如果对于旧域来说无论如何都没有更多内容。
缺点:每次更改重定向时,都必须重新加载或重新启动 Apache Web 服务器。
.htaccess
如果无法访问虚拟主机配置(例如,当使用共享主机提供商托管时),则可以通过该.htaccess
文件在 Web 服务器中“本地”执行重定向。
如果需要定期更改重定向,或者由不具备 Apache Web 服务器管理权限的用户更改重定向,则此变体也很有用。
文件变体的另一个优点.htaccess
是可以更改重定向(前提是域已经正确配置),而无需重新启动或重新加载 Apache Web 服务器。
通过 Apache Web 服务器进行重定向
重定向指令 (mod_alias)
最简单的方法是使用Redirect
来自模块的指令mod_alias
(必须启用该模块)。
重定向指令的语法是:
Redirect [status] [URL-path] URL
- 例子
Redirect 301 /sub https://example-new1.com/ Redirect 301 / https://example.com/
- 虚拟主机示例
<VirtualHost *> ServerName www.example-old.com Redirect 301 /sub https://example-new1.com/ Redirect 301 / https://example.com/ </VirtualHost>
Redirect
可以多次用于不同的 URL 路径和重定向。可以通过Location
或定义重定向的条件LocationMatch
,有关此内容(包括示例)的更多信息,请参阅重定向参考。
还有一个RedirectMatch
指令,其作用与指令相同Redirect
,但支持正则表达式匹配。
重写规则 (mod_rewrite)
更强大的条件重定向是通过RewriteRule
来自mod_rewrite
模块(必须启用该模块)。
RewriteRule 指令的语法是:
RewriteRule Pattern Substitution [flags]
- 例子
RewriteEngine on RewriteCond %{HTTP_HOST} ^www.example-old.com RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301]
- 虚拟主机示例
<VirtualHost *> ServerName www.example-old.com RewriteEngine on RewriteCond %{HTTP_HOST} ^www.example-old.com RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301] </VirtualHost>
RewriteEngine on
请注意,尽管该mod_rewrite
模块是在服务器端启用的,但必须通过明确启用重写引擎。
可以通过 来定义条件RewriteCond
,甚至每个 都可定义多个条件RewriteRule
。
的旗帜RewriteRule
:
R=301
表示执行了重定向,HTTP 状态代码为301
。L
意味着规则处理将在此时停止,因为要执行重定向。
评分
我不知道任何测量或统计数据,但我认为重定向指令在里面虚拟主机是最快或最有效的变体,因为
- 重写引擎不需要加载
- 当 Apache 服务器加载时,VHost 会被缓存,因此不需要搜索
.htaccess
文件
对于 SEO 友好性,变体没有区别,对外部来说总是发生 SEO 友好的 301 重定向,所以没有区别。
答案2
只是为了澄清一下——这是否是一种无论出于什么原因都完全不能使用 CDN 的情况?
如果没有的话,我建议页面规则通过 Cloudflare 的免费计划,我个人就是用这个来做这件事的。他们有一个简单的“转发 URL”选项,您可以在 302 和 301 之间进行选择。这自然比大多数人直接从单个服务器提供服务所能实现的任何速度都要快得多,因为我们谈论的是具有积极缓存处理的大型 CDN,并从网络边缘提供服务。如果您需要以这种方式处理许多重定向,您也可以使用他们的 Workers 或/和批量重定向。
答案3
RewriteCond %{HTTP_HOST} *!^www*.url\.com [NC]
RewriteRule (.*) http://www.url.com/$1 [L,R=301]]
上述两个表达式告诉 Apache 检查访问者正在访问的主机。www.url.com否定了比较,说,“如果主持人不是网址:,然后执行 RewriteRule。”在我们的例子中,RewriteRule 将它们重定向到www.url.com同时在反向引用中保留他们正在访问的精确文件。