Apache.htaccess将https重定向到http,反之亦然



我正在尝试安装drupal 7,将三个页面重定向到https,并强制其他所有页面返回http。孤立地说,这里的第一条重写规则是有效的。启用两者后,什么都不起作用,全部重定向回/index.php

# Turn SSL on for checkout except for checkout, signup/login and user/login
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^(/checkout)$ [NC,OR]
RewriteCond %{REQUEST_URI} ^(/signup/login)$ [NC,OR]
RewriteCond %{REQUEST_URI} ^(/user/login)$ [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
# Turn SSL off everything but checkout, signup/login and user/login
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !(checkout|signup/login|user/login) [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]

这看起来是正确的,规则对我有效。由于第一个规则有效,我假设RewriteEngine on在这些规则之上。你的htaccess文件中还有其他规则吗?可能是其他原因导致了这个问题。

我尝试了以下规则,并按预期被两个规则重定向。HTTPS规则的缺失不应该有什么不同。

RewriteEngine on
# Turn SSL on for checkout except for checkout, signup/login and user/login
RewriteCond %{REQUEST_URI} ^(/checkout)$ [NC,OR]
RewriteCond %{REQUEST_URI} ^(/signup/login)$ [NC,OR]
RewriteCond %{REQUEST_URI} ^(/user/login)$ [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}/ssl/$1 [R=301,L]
# Turn SSL off everything but checkout, signup/login and user/login
RewriteCond %{REQUEST_URI} !(checkout|signup/login|user/login) [NC]
RewriteRule ^ssl/(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]

我设置了这些文件来测试:

  • 公众/
    • 检出(内容:检出)
    • foobar(内容:foobar)
    • 注册/
      • 登录(内容:注册/登录)
    • 用户/
      • 登录(内容:用户/登录)
    • ssl/
      • checkout(内容:ssl checkout)
      • foobar(内容:ssl foobar)
      • 注册/
        • 登录(内容:ssl注册/登录)
      • 用户/
        • login(内容:ssl用户/登录)

你可以尝试这些规则,并看到它们如预期的那样工作:

$ curl -L http://samhuri.net/checkout
ssl checkout
$ curl -L http://samhuri.net/ssl/checkout
ssl checkout
$ curl -L http://samhuri.net/foobar
foobar
$ curl -L http://samhuri.net/ssl/foobar
foobar

curl传递给-i标志以查看标题和状态代码。

所以我怀疑其他地方出了问题。你有其他规则可以重定向到https或从https重定向吗?

最新更新