我正在使用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]
答案 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