【发布时间】:2014-01-26 03:28:10
【问题描述】:
我正在尝试重定向以下条件:
http://mydomain.com
http://www.mydomain.com
到:
https://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