Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 将非www重写为www,将HTTP重写为HTTPS_Apache_Amazon Web Services_Dns - Fatal编程技术网

Apache 将非www重写为www,将HTTP重写为HTTPS

Apache 将非www重写为www,将HTTP重写为HTTPS,apache,amazon-web-services,dns,Apache,Amazon Web Services,Dns,我同时具备以下两项要求: 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负

我同时具备以下两项要求:

  • 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负载平衡器,
重写规则
旨在避免仅在处理
elbcheck.html
文件时重新写入,因为它是AWS负载平衡器健康检查的目标。这是经过测试和工作的()

但是,我一直很难让非www路由到www。我曾一度接近www,但在重新写入时遇到了一个重大问题

如何使http到https的重新写入保持正常工作,同时修复非www到www的重新写入?

您可以使用

   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]
你可以用

   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]

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

使用这个,我重写了我的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之后,我立即注意到重定向开始从有问题的服务器开始工作

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

这篇文章基本上说,有问题的重定向不能仅通过配置来解决,需要证书级别的相互支持。我的通配符证书没有涵盖“apex域”案例,因此导致浏览器抱怨证书的有效性


幸运的是,对我来说,因为我使用了AmazonWeb服务,所以修复证书问题很容易。我刚刚向ACM申请了一个新的证书,其中包括apex和通配符。我在AWS负载平衡器上安装了证书,现在我的问题已经解决。

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

使用这个,我重写了我的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之后,我立即注意到重定向开始从有问题的服务器开始工作

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

这篇文章基本上说,有问题的重定向不能仅通过配置来解决,需要证书级别的相互支持。我的通配符证书没有涵盖“apex域”案例,因此导致浏览器抱怨证书的有效性


幸运的是,对我来说,因为我使用了AmazonWeb服务,所以修复证书问题很容易。我刚刚向ACM申请了一个新的证书,其中包括apex和通配符。我在AWS负载平衡器上安装了证书,现在我的问题已经解决。

在运行状况检查中将ELB检查更改为TCP协议,将端口80更改为端口80。然后应用这些规则。在运行状况检查中将ELB检查更改为TCP协议,将端口更改为80。然后应用这些规则。我喜欢你的做法,但是当重新启动Apache时,我在最后一行遇到语法错误
RewriteRule:bad flag delimiters Apache config test失败,中止
抱歉,我跳过了一行。我已经更新了我的答案。它将解析您的查询。语法正常,但现在
http://www.example.com
重写为
http://www.www.example.com
。那太糟糕了。不过,谢谢你的帮助!我喜欢您的做法,但在重新启动Apache时,我在最后一行遇到语法错误
RewriteRule:bad flag delimiters Apache config test失败,中止
抱歉,我跳过了一行。我已经更新了我的答案。它将解析您的查询。语法正常,但现在
http://www.example.com
重写为
http://www.www.example.com
。那太糟糕了。不过,谢谢你的帮助!我还想指出,我的问题的一大部分首先是无法阅读和理解Apache mod_rewrite。这非常复杂,尤其是当您还需要阅读和理解正则表达式语法时。我发现以下几点有助于我足够熟练地使用配置:我还想指出,我的问题的一大部分首先是无法阅读和理解Apache mod_rewrite。这非常复杂,尤其是当您还需要阅读和理解正则表达式语法时。我发现以下内容有助于我熟练掌握配置,从而帮助我的配置正常工作: