【问题标题】:htaccess to redirect http:// and http://www to https:// that plays nice with subdomainshtaccess 将 http:// 和 http://www 重定向到 https:// ,这对子域很有效
【发布时间】:2014-01-26 03:28:10
【问题描述】:

我正在尝试重定向以下条件:

http://mydomain.com
http://www.mydomain.com

到:

https://mydomain.com

但我不希望它与子域混淆任何东西,以便键入的人:

http://m.mydomain.com

不会被重定向到 https。我现在的 htaccess 文件如下所示:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

我已经尝试使用我在这里找到的一些关于堆栈溢出的示例,例如这个:

RewriteCond %{HTTP_HOST} !^mydomain\.com$ [NC,OR]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://mydomain.com/$1 [R=301,L]

但尽管它似乎对那个人有效,但对我来说却导致了“重定向循环”。顺便说一句,在我完成这项工作后,我需要添加一些重定向来处理子域,例如以不可见的方式(不更改 URL)将 http://m.mydomain.com 重定向到 http://mydomain.com/m。所以这里所做的一切都不应该阻止这种情况的发生。

如果有帮助,该站点将托管在 Rackspace 云站点上

有人知道怎么做吗?

谢谢!

编辑

我试过了:

#http to https
RewriteCond %{HTTP_HOST} ^www\.mydomain\.com [NC]
RewriteRule ^(.*)$ https://mydomain.com/$1 [L,R=301]

#subdomain 1
RewriteBase /
RewriteCond %{HTTP_HOST} ^sub1.mydomain.com [NC]
RewriteRule ^(.*)$ http://mydomain.com/sub1/$1 [R=301,L]

它似乎在大多数情况下都有效,除了当我输入子文件夹时它似乎不起作用。例如,如果我在地址栏中输入:

mydomain.com/temp

解析为:

http://mydomain.com/temp/

编辑 2

嗯,我已经取得了一些进展。到目前为止,我已经将 www 重定向到非 www,并且子域正常工作(尽管地址栏确实发生了变化 - 我想这是可以接受的)。如果我在其中放置任何类型的强制https,似乎会造成混乱。它似乎与 www 到非 www 块冲突。我可以有一个或另一个。有没有办法让这两个部分协同工作?

另外,WordPress 站点地址和 WordPress 地址都设置为https://mydomain.com

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

# Redirect from www to non-www location
RewriteCond %{HTTP_HOST} ^www\.mydomain\.com [NC]
RewriteRule ^(.*)$ https://mydomain.com/$1 [R=301,L]

# Redirect http to https
# THIS DOES NOT WORK - causes redirect loop
#RewriteCond %{HTTPS} off
#RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

# subdomain
RewriteBase /
RewriteCond %{HTTP_HOST} ^sub1.mydomain.com [NC]
RewriteRule ^(.*)$ http://mydomain.com/sub1/$1 [R=301,L]

RewriteBase /
RewriteCond %{HTTP_HOST} ^sub2.mydomain.com [NC]
RewriteRule ^(.*)$ http://mydomain.com/sub2/$1 [R=301,L]

结论

对于大多数网络主机,anubhava 的解决方案可以正常工作。然而,我相信这里的关键是 Rackspace。他们有自己喜欢的方法,我通过搜索他们的知识库找到了这些方法。这是运行良好的最终 htaccess 文件。所有 www url 都被发送到非 www url,http 被发送到 https,并且子域重定向到其正确的子目录,而不会弄乱 WordPress:

RewriteEngine On
RewriteBase /

#subdomain 1
RewriteCond %{HTTP_HOST} ^sub1.mydomain.com [NC]
RewriteRule ^(.*)$ http://mydomain.com/sub1/$1 [R=301,L]

#subdomain 2
RewriteCond %{HTTP_HOST} ^sub2.mydomain.com [NC]
RewriteRule ^(.*)$ http://mydomain.com/sub2/$1 [R=301,L]

#get rid of www, works with rackspace cloud sites
RewriteCond %{HTTP_HOST} ^www.mydomain.com [NC]
RewriteRule ^(.*)$ https://mydomain.com/$1 [R=301,L]

#force https, works with rackspace cloud sites
RewriteCond %{ENV:HTTPS} !on [NC]
RewriteRule ^(.*)$ https://mydomain.com/$1 [R,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

非常感谢您为此提供的所有帮助。

【问题讨论】:

  • jbalyo,非常感谢您给予@anubhava 信用,您应该将您的“结论”移至单独的答案并将其标记为答案。我完全跳过了您的问题以阅读已解决的答案,但是阅读了该答案的所有 cmets 使我回到了此处。
  • 如果你这样做了,立即 +1 ;)
  • @ps2goat:公平点,我用下面的最终结果更新了答案。

标签: apache .htaccess ssl https rackspace-cloud


【解决方案1】:

你可以像这样拥有你的 .htaccess:

RewriteEngine On
RewriteBase /

#subdomain 1
RewriteCond %{HTTP_HOST} ^sub1.mydomain.com [NC]
RewriteRule ^(.*)$ http://mydomain.com/sub1/$1 [R=301,L]

#subdomain 2
RewriteCond %{HTTP_HOST} ^sub2.mydomain.com [NC]
RewriteRule ^(.*)$ http://mydomain.com/sub2/$1 [R=301,L]

#get rid of www, works with rackspace cloud sites
RewriteCond %{HTTP_HOST} ^www.mydomain.com [NC]
RewriteRule ^(.*)$ https://mydomain.com/$1 [R=301,L]

#force https, works with rackspace cloud sites
RewriteCond %{ENV:HTTPS} !on [NC]
RewriteRule ^(.*)$ https://mydomain.com/$1 [R,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

PS:请注意,HTTPS 服务器变量在 Rackspac 云环境中未正确实现。在 Rackspace 云中查看 HTTPS 的正确变量是 ENV:HTTPS

【讨论】:

  • 我试过了,谢谢 - 但它创建了一个重定向循环并使网站崩溃。我不知道为什么......
  • 我刚刚尝试过,仍然得到一个重定向循环。现在我无法访问 /wp-admin/ 了。嗯……
  • 好吧,wp-admin 的事情一定是一些奇怪的 DNS 问题 - 也许域仍在传播(我们在 12 小时前切换了它)。是的,输入https://mydomain.com/ 有效,但我正在努力让输入http://mydomain.com/ 将转发到https://
  • 同样的结果,对不起。重定向循环。我尝试删除子域部分,但仍然有相同的结果。我将用我最新的 htaccess 文件更新我的问题。我取得了一点进展
  • 我又试了一次,重定向循环。这很奇怪。我几乎想知道 WordPress 是否可能会尝试以不同的方式转发内容,从而导致循环。我确实按照您的建议将 WP URL 设置为 https://mydomain.com
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 2015-05-19
  • 2016-01-20
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
相关资源
最近更新 更多