【问题标题】:Rewrite Non-www to www and HTTP to HTTPS将非 www 重写为 www 和 HTTP 到 HTTPS
【发布时间】:2016-06-08 22:45:10
【问题描述】:

我同时满足以下两个要求:

  • http 到 https
  • 非 www 到 www

为了处理第一个要求,我有以下 Apache 配置部分:

ServerName www.example.com
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule !/elbcheck.html https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

X-Forwarded-Proto 条件适用于我的 AWS 负载均衡器,RewriteRule 旨在仅在处理 elbcheck.html 文件时避免重写,因为它是 AWS 负载均衡器运行状况检查的目标。这是经过测试和工作的 (source)。

但是,我很难始终让非 www 路由到 www。我一度接近,但遇到了https://example.com重写https://www.example.com的一个主要问题

如何让我的 http 到 https 重写工作正常,同时也修复我的非 www 到 www 重写?

【问题讨论】:

  • 健康检查中将ELB检查改为TCP协议到80端口。然后应用这些规则。

标签: apache amazon-web-services dns


【解决方案1】:

这个问题的解决方案是多管齐下的。首先,我在 ServerFault 上找到了一个非常有用的答案:

https://serverfault.com/a/728957/336268

使用它,我重写了我的 Apache 配置,如下所示。请注意,它仍然保留了我的 elbcheck.html 避免要求。

RewriteEngine On

# Ensure www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule !/elbcheck.html https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# Ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule !/elbcheck.html https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

在执行此操作并重新启动 Apache 后,我注意到重定向开始从有问题的 https://example.com 开始工作

但是,出现了一个新问题。浏览器开始抱怨安全证书无效。再做一些研究,我很幸运地找到了这篇文章:

http://www.jasonsamuel.com/2011/03/07/how-to-properly-use-ssl-redirects-without-getting-certificate-error-messages/

文章基本上说有问题的重定向https://example.com 不能仅通过配置解决,需要证书级别的互惠支持。我的通配符证书没有涵盖“顶级域”案例,因此导致浏览器抱怨该案例的证书有效性。

幸运的是,对我来说,因为我使用的是 Amazon Web Services,所以修复证书问题是一件轻而易举的事。我刚刚向 ACM 请求了一个包含顶点和通配符的新证书。我在我的 AWS 负载均衡器上安装了证书,现在我的问题已经解决了。

【讨论】:

  • 我还想评论一下,我的问题的很大一部分首先是无法阅读和理解 Apache mod_rewrite。它非常复杂,尤其是当您还需要阅读和理解正则表达式语法时。我发现以下内容有助于让我足够熟练以帮助我的配置正常工作:httpd.apache.org/docs/current/rewrite/intro.html
【解决方案2】:

你可以使用

   RewriteEngine On
   RewriteCond %{HTTP:X-Forwarded-Proto} !https
   RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
   RewriteRule ^/elbcheck\.html$ - [L]
   RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI}   [R=301,L]

【讨论】:

  • 我喜欢你的做法,但是在重新启动 Apache 时,我在最后一行出现语法错误RewriteRule: bad flag delimiters apache config test fails, aborting
  • 对不起,我跳过了一行。我已经更新了我的答案。它将解决您的查询。
  • 语法正常,但现在 http://www.example.com 重写为 http://www.www.example.com。那很糟。不过,感谢您的帮助!
猜你喜欢
  • 2017-12-04
  • 2014-12-16
  • 2018-09-26
  • 2015-01-10
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
相关资源
最近更新 更多