首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache2 https和www重定向

问Apache2 https和www重定向
EN

Webmasters Stack Exchange用户
提问于 2018-01-18 10:53:33
回答 2查看 201关注 0票数 1

我想将我自己Debian Apache2服务器上的网站提交给HSTS预压表。

它告诉我,我有几件事情设置不正确,所以我做了调整,现在似乎很满意。只有一件事我不知道它是如何工作的,或者我做得对吗?以下将代码重定向到https和www的代码直接放在虚拟主机配置文件中。有人能看一看,并向我解释它是如何工作的,如果有任何错误,请建议纠正。

代码语言:javascript
复制
RewriteEngine          on
RewriteCond            %{HTTPS} !on
RewriteRule            ^/?(.*) https://%{SERVER_NAME}/$1 [R=301]
RewriteCond            %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule            ^(.*)$ https://%1/$1 [R]

EDIT1 1:

此代码的所有行都放在HTTP (端口80)部分。

EDIT2 2:

我不确定是删除www还是添加它。因此,如果实现起来并不困难,我欢迎看到这两种方法。

EN

回答 2

Webmasters Stack Exchange用户

回答已采纳

发布于 2018-01-18 19:02:09

直接放置在虚拟主机中

但到底在哪里?如果您已经实现了SSL,那么至少有两个VirtualHost容器,一个用于SSL/HTTPS (端口443),另一个用于HTTP (端口80)。

为了成功地实现HTTPS重定向,您需要将这些指令放置在端口80的VirtualHost容器中。但是,如果是这样的话,那么对HTTPS的检查是多余的。但是,如果这些指令仅位于端口80的VirtualHost中,那么当直接访问非规范的https://www.example.com URL时,www到非www规范化将永远不会发生。(或者您是否将这些指令放在两个VirtualHosts中?这是不必要的。)

RewriteRule ^/?(.*) https://%{SERVER_名称}/$1

如果没有L标志,处理将继续进行。如果您请求http://www.example.com,那么它将重定向到https://example.com。但是,通常情况下,这似乎破坏了HSTS预压表的先决条件之一,即您应该重定向到同一台主机。(因此,很难说这在满足HSTS预加载列表的标准方面是如何“工作”的?)

%{SERVER_NAME} -虽然这在您的服务器上可以正常工作,但这并不是在这个实例中使用的最可靠的变量,因为您希望始终重定向到同一个主机(而不是定义的ServerName)。您应该在这里使用HTTP_HOST,以确保重定向到请求中指定的同一主机。(在默认服务器配置中,SERVER_NAME与HTTP_HOST相同,但这取决于是否设置了UseCanoncialName。)

RewriteRule ^(.*)$ https://%1/$1

正如@ltai在他的答复中已经提到的,这是一个临时的(302)重定向,应该是永久的(301)重定向。您还缺少了L标志,如果添加以后的指令,可能会导致问题。

此外,当在VirtualHost上下文中使用时,这将导致RewriteRule替换中的双斜杠,例如。https://example.com//,因为捕获的模式包括斜杠前缀(在VirtualHost上下文中)。在您的第一个RewriteRule中,您特别排除了斜杠前缀(即。^/?(.*));您应该在这里做同样的事情。

这些指令应该被分割到两个(或更多) VirtualHosts中。例如:

代码语言:javascript
复制
ServerName example.com
ServerAlias www.example.com

# Unconditional redirect to HTTPS on the same host
# (The "same host" is a requirement of the HSTS preload list)
RewriteEngine On
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]



ServerName example.com
ServerAlias www.example.com

# SERVER_NAME now refers to the value of ServerName, not HTTP_HOST
UseCanonicalName On

# Redirect from www to the canonical ServerName
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

通常,您将在一个重定向中实现HTTP到HTTPS和www到non规范化。但是,HSTS预加载列表的一个要求是,您应该将HTTP重定向到同一主机上的HTTPS,这意味着您需要将其保持为2。(但是,一旦您在HSTS预加载列表中,那么HTTP到HTTPS重定向无论如何也不会发生。)

票数 2
EN

Webmasters Stack Exchange用户

发布于 2018-01-18 15:58:45

我唯一要改变的就是设置最后一条规则来永久地重定向。

代码语言:javascript
复制
RewriteEngine          on

这条线说要打开重定向引擎,否则任何规则都不起作用。

代码语言:javascript
复制
RewriteCond            %{HTTPS} !on

也就是说,条件是该方案不是https。这与使用off而不是使用不打开的!on相同。

代码语言:javascript
复制
RewriteRule            ^/?(.*) https://%{SERVER_NAME}/$1 [R=301]

这是在HTTPS不打开时执行的规则。它说,在启动斜杠之后(如果有)或URL的整个部分,不管是什么,都可以重定向到同一个服务器上的HTTPS。这里的回应是301,这是一个永久的重定向。

代码语言:javascript
复制
RewriteCond            %{HTTP_HOST} ^www\.(.*)$ [NC]

上面的行表示,条件是主机以www.开头,并且捕获之后的任何内容,以便在下一个规则中使用。这就是为什么它有一个(.*)。

代码语言:javascript
复制
RewriteRule            ^(.*)$ https://%1/$1 [R]

此规则要求将任何请求重定向到https://,然后重定向主机中位于www (%1)之后的部分,然后再重定向请求($1)。结果是302 TemporaryRedirect,因为您没有指定返回代码(如R=301 ),因为您的代码更高了2行。

这段代码的好处是,您没有硬编码服务器或域名,因此它是相当通用的,并且可以在许多站点上使用。

票数 1
EN
页面原文内容由Webmasters Stack Exchange提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://webmasters.stackexchange.com/questions/112096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档