htaccess重定向到www。在一个场景中没有在负载均衡器后面工作

时间:2014-06-06 02:21:49

标签: apache .htaccess mod-rewrite

我正在使用Amazon Beanstalk,因此我的基础架构是

USER --(HTTPS)--> BEANSTALK BALANCER --(HTTP)--> EC2 INSTANCES

现在用户是否转到

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

我想要始终重定向到

https://www.mydomain.com

我的https工作正常,但由于某种原因,当我直接访问该网页时,www重定向无效https://mydomain.com

Options +FollowSymlinks -MultiViews -Indexes

RewriteEngine On

RewriteRule ^(.*)/$ /$1 [L,R=301]

# If not on www., redirect to www. on SSL (does not work when accessing https://mydomain.com)
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/index.php/status$
RewriteCond %{HTTP_HOST} !^www
#RewriteCond %{HTTP_HOST} ^mydomain\.com$
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

# If not on SSL(ish), redirect to SSL (works)
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/index.php/status$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
#RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]

1 个答案:

答案 0 :(得分:1)

多个RewriteCond默认为逻辑AND操作。您的两个条件检查转发的协议是否为https AND请求的主机不以www开头。您的输入网址https://example.com(具有HTTPS但没有www)不符合这两个条件,因此规则不会执行。

由于第一次重定向的作用是应用www尚未存在的地方,因此您无需在该通行证上检查https。只需检查是否存在www,然后使用https://重定向到首选主机。

# Do the SSL redirect first to protect your users
# If not on SSL(ish), redirect to SSL (works)
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/index.php/status$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
# If you don't mind a hard-coded domain here, you can avoid a second
# redirect if the www is missing...
# RewriteRule  ^(.*)$ https://www.example.com/$1 [R=301,L]

# Then add the www.
# Do not check the protocol here.
RewriteCond %{REQUEST_URI} !^/index.php/status$
RewriteCond %{HTTP_HOST} !^www
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

以上结果可能会为最终用户提供两次重定向。可以使用()上的可选www.组将这两者捆绑到一个块中,并将主机的其余部分捕获到%1以便在{{1}中使用}}。

这是未经测试的......

RewriteRule