Preserve Domain Alias

时间:2017-08-24 作者:Kumar

我在示例上安装了一个站点Wordpress。com。DNS配置为www.example。com是示例的别名。com。客户端希望用户在导航栏上看到www.,因此这很重要。

我在运行cpanel的apache服务器上托管了他们的网站。cpanel以域集为例。com。在安装wordpress之前,键入www.example。com打开了目录,并将www.放在导航栏上,太棒了。

在我安装wordpress之后,www.被删除了。当我进行重定向跟踪时,我发现这个奇怪的302重定向:

http://www.example.com
Status: 302 Found
Code:   302
Date:   Thu, 24 Aug 2017 00:23:08 GMT
Server: Apache/2.4.16 (Unix) OpenSSL/1.0.1e-fips mod_bwlimited/1.4
Location:   https://example.com
Content-Length: 346
Connection: close
Content-Type:   text/html; charset=iso-8859-1
我修改了wordpress的htaccess文件以强制ssl,但我认为这是一个301:

SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq "example.com"
ErrorDocument 403 https://example.com
好吧,随便了。所以我删除了这段代码,URL栏仍然没有保留www。这次我得到了301重定向:

http://www.example.com
Status: 301 Moved Permanently
Code:   301
Date:   Thu, 24 Aug 2017 00:35:22 GMT
Server: Apache/2.4.16 (Unix) OpenSSL/1.0.1e-fips mod_bwlimited/1.4
X-Powered-By:   PHP/5.6.16
Location:   http://example.com/
Content-Length: 0
Connection: close
Content-Type:   text/html; charset=UTF-8
我不知道还能去哪里找。我需要在cpanel、htaccess或wordpress中做什么才能让URL栏保留www。

2 个回复
最合适的回答,由SO网友:MrWhite 整理而成

您需要设置规范主机名(即www) 在WordPress仪表板中。。。在“设置”>“常规”下,设置相应的“WordPress地址(URL)”和“网站地址(URL)”属性。

或者,这些值可以硬编码wp_config.php 通过定义WP_HOMEWP_SITEURL 分别为常数。

参考文献:
https://codex.wordpress.org/Changing_The_Site_URL

SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq "example.com"
ErrorDocument 403 https://example.com
顺便提一下,这是一种非常迂回的(不推荐)重定向到HTTPS的方式。是的,这将触发302(临时)重定向,而不是301(永久)重定向。这只会重定向,因为ErrorDocument. 并且它只重定向到文档根目录,请求的URL将丢失。

此代码实际上阻止了对仅HTTP站点的访问,并触发403禁止。因为您已经将绝对URL设置为自定义403的第二个参数,Apache会触发一个外部(302)重定向到URL,即站点的根。

如果您没有访问服务器配置的权限,则通常使用中的mod\\u rewrite来实现此重定向.htaccess. 例如:

RewriteCond %{HTTPS} !on
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]
这需要在中现有的WordPress指令之前执行.htaccess.

一旦在WordPress中设置了适当的主机名,就可以在中处理HTTPS和www重定向.htaccess 如果你愿意(效率会稍微高一点)。例如:

RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} !www\\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]
确保在测试之前清除浏览器缓存。

只有当用户开始输入www.时,我才需要保留它。

除非你有具体的理由这样做,否则这通常是个坏主意。它可能会创建重复的内容,尽管您可以设置rel="canonical" 中的标记head 部分来缓解这种情况,您可以在Google搜索控制台中指定一个首选项(以避免两个主机都被索引)。但是统计数据将在他们之间进行分配。您如何设置Cookie?如果您希望在www和非www(登录、会话等)之间共享Cookie,则需要确保在apex域上设置Cookie,无论访问哪个主机-我不认为这是默认行为。

无论如何,如果您想将HTTP重定向到HTTPS,但保留已访问的任何主机(www、非www或xyz别名),那么这是一个更简单的重定向,因为您可以引用HTTP_HOST 服务器变量。例如:

RewriteCond %{HTTPS} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

SO网友:Kumar

更改wordpress中的规范主机名意味着现在所有流量都变成了www。在这个特定的用例中,只有当用户以www的身份进入时,他们才应该继续看到www URL。否则,他们应该看看例子。com,就在他们进入的时候。在做了更多的研究之后,我发现一种方法是在wp\\u config中添加以下行。php。

define(\'WP_SITEURL\', \'http://\' . $_SERVER[\'HTTP_HOST\']);
define(\'WP_HOME\', \'http://\' . $_SERVER[\'HTTP_HOST\']);
我对这段代码的理解是,任何声明为示例别名的url。DNS和Cpanel中的com都将显示wordpress站点,并保留URL。

为了借鉴White先生的SSL建议,我稍微修改了他的代码,以适应需要允许两个URL(带和不带www)的事实:

# Force SSL While Preserving www.#
RewriteCond %{HTTPS} !on
RewriteCond %{HTTP_HOST} www\\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]

# Force SSL for non-www. Traffic #
RewriteCond %{HTTPS} !on
RewriteCond %{HTTP_HOST} !www\\.
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]
如果需要添加第三个或第四个etc别名,则需要使RewriteCond更加具体,并需要额外的重写块。

结束