如何从http://重定向到https://到https:// www,而又不破坏不是www的其他子域?

时间:2019-03-28 22:56:02

标签: regex apache .htaccess redirect http-redirect

环境:

WordPress在运行测试管道的Docker容器上运行,首先进入开发(https://dev.example.com),然后进入阶段(https://stage.example.com),最后进入生产阶段(https://www.example.com)。

请注意,Dev和Stage都没有拥有“ www”子域,而生产版本却没有。

问题:

出于安全原因,我必须设置一个额外的重定向。当前,当用户进入没有SSL(即http://example.com)的我们的网站时,他们将被重定向到受保护的子域(即https://www.example.com)。

但是,为了安全起见,他们需要先点击https://example.com ,然后再重定向到安全子域。如:

1)http://example.com->

2)https://example.com->

3)https://www.example.com

我们必须以www作为最终结果,并且必须具有额外的重定向(可悲的是没有摆动空间)。

现在,我受困的是此重定向和开发/阶段网站。

我可以使用以下代码从http://example.com-> https://example.com-> https://www.example.com进行生产重定向:

<IfModule mod_rewrite.c>
RewriteEngine On
# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} example.com$
RewriteRule ^ https://example.com [L,R=301]

# ensure www.
RewriteCond %{HTTP_HOST} !^www\.example.com$ [NC]
RewriteRule ^ https://www.example.com [L,R=301]
</IfModule>

但是当将此代码移至开发人员/阶段时,它们会被杀死502。

我尝试使用下面的代码仅在服务器不是www或dev或stage时重定向到www,但是从http://example.comhttps://example.com的重定向失败!

<IfModule mod_rewrite.c>
RewriteEngine On
# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} example.com$
RewriteRule ^ https://example.com [L,R=301]

# ensure www only if not dev/stage
RewriteCond %{HTTP_HOST} !^(www|dev|stage)\.example.com$ [NC]
RewriteRule ^ https://www.example.com [L,R=301]
</IfModule>

请帮助!我知道使用这么多重定向是最重要的,但这是我所获得的要求,我无法更改它们。

真的很感谢任何帮助,我在这里查看了许多其他答案,它们也有所帮助,但我无法克服开发/阶段重定向失败的麻烦。我被卡住了!


我的完整htaccess文件:

<IfModule mod_rewrite.c>

 RewriteEngine On
 # ensure https
 RewriteCond %{HTTP:X-Forwarded-Proto} !https
 RewriteCond %{HTTPS} off
 RewriteCond %{HTTP_HOST} (^|\.)example\.com$
 RewriteRule ^/?(.*)$ https://%{HTTP_HOST}/$1 [R=302]

 # ensure www.
 RewriteCond %{HTTP_HOST} ^example\.com$ [OR]
 RewriteCond %{HTTP_HOST} !^(www|corp-dev|corp-stage)\.example\.com$
 RewriteRule ^/?(.*)$ https://www.example.com/$1 [R=302]

# link Redirection

RewriteEngine On
RewriteRule ^health\.html$ "/health.html" [END]

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

</IfModule>

2 个答案:

答案 0 :(得分:1)

最终为我解决了这个问题的原因:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP:X-Forwarded-Proto} =http
  RewriteCond %{HTTP_HOST} ^example.com$
  RewriteRule (.*)$ https://example.com/$1 [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP:X-Forwarded-Proto} =http
  RewriteCond %{HTTP_HOST} ^www.example.com$
  RewriteRule (.*)$ https://www.example.com/$1 [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP:X-Forwarded-Proto} =http
  RewriteCond %{HTTP_HOST} ^dev.example.com$
  RewriteRule (.*)$ https://dev.example.com/$1 [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP:X-Forwarded-Proto} =http
  RewriteCond %{HTTP_HOST} ^stage.example.com$
  RewriteRule (.*)$ https://stage.example.com/$1 [R=301,L]
</IfModule>

我的WordPress网站的“常规设置”标签下的“网站URL”设置为https://www.example.com,这导致其他解决方案出现了很多循环。

由于我提到的设置,这对我不起作用,但是我将发布另一种我尝试过的解决方案,它可能会帮助其他人:

<IfModule mod_rewrite.c>
RewriteEngine On
# Redirect HTTP to HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://example.com/$1 [R,L]

# Redirect example.com to www.example.com
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^/?(.*) https://www.example.com/$1 [R,L]
</IfModule>

答案 1 :(得分:0)

您的尝试几乎是正确的,我只是做了一些微不足道的调整:

RewriteEngine On
# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} (^|\.)example\.com$
RewriteRule ^/?(.*)$ https://%{HTTP_HOST}/$1 [R=301]

# ensure www.
RewriteCond %{HTTP_HOST} ^example\.com$ [OR]
RewriteCond %{HTTP_HOST} !^(www|dev|stage)\.example\.com$
RewriteRule ^/?(.*)$ https://www.example.com/$1 [R=301]

通常,最好使用302重定向开始测试,然后在一切正常的情况下才将其更改为301。这样一来,您可以防止测试时出现缓存问题。

此规则将同样在HTTP服务器主机配置或动态配置文件内(“htaccess的”文件)工作。显然,重写模块需要加载到http服务器内部并在http主机中启用。如果使用动态配置文件,则需要注意在主机配置中完全启用了它的解释,并且该解释位于主机的DOCUMENT_ROOT文件夹中。

还有一个一般性说明:您应该始终喜欢将此类规则放置在http服务器主机配置中,而不要使用动态配置文件(“ .htaccess”)。这些动态配置文件增加了复杂性,通常是导致意外行为,难以调试的原因,并且确实降低了http服务器的速度。仅当您无法访问真正的http服务器主机配置(阅读:真正便宜的服务提供商)或坚持编写自己的规则的应用程序(这显然是安全的噩梦)时,才提供它们作为最后的选择。