我们网站的主页兼作登录页面和主页面,用户可以在其中单击指向内容的链接。我试图做到这一点,以便当主页充当登录页面时,它使用 HTTPS 并在所有其他场合使用 HTTP。当前没有用户登录时,主页充当登录页面(我可以为此检查 cookie):
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_COOKIE} ^((?!MY_LOGIN_COOKIE_NAME).)*$ # Cookie is not present
RewriteRule ^/?$ https://%{SERVER_NAME} [R,L] # Redirect http://example.com to https://example.com
如预期的那样,这会将匿名用户带到 SSL 主页。
问题是当 cookie 确实存在时,如何使对主页的请求始终重定向到 HTTP 版本而不是 HTTPS 版本? (用户登录后,他们被带回首页,但现在它会显示内容)。
我尝试将其附加到上述规则的末尾:
RewriteCond %{HTTP_COOKIE} ^.*MY_LOGIN_COOKIE_NAME=([^;]+) # Cookie exists
RewriteRule ^/?$ http://%{SERVER_NAME} [R,L] # Redirect home page to HTTP only
这会导致重定向循环错误,很可能是因为正则表达式匹配主页,重定向到 http 版本,再次匹配,重定向到 http 版本。 . .无限。
有没有一种方法可以使主页在缺少 cookie 时重定向到 HTTPS,而在存在时重定向到 HTTP?
最佳答案
你能试试这两条规则吗:
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteCond %{HTTP_COOKIE} !MY_LOGIN_COOKIE_NAME [NC]
RewriteRule ^/?$ https://%{SERVER_NAME} [R,L]
RewriteCond %{SERVER_PORT} =443
RewriteCond %{HTTP_COOKIE} MY_LOGIN_COOKIE_NAME [NC]
RewriteRule ^/?$ http://%{SERVER_NAME} [R,L]
关于Apache 有条件地将一页重定向到 HTTP 或 HTTPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31482272/