我正在尝试安装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重定向吗?