在运行 varnish 的 apache 2.2 服务器上,我试图将整个 Drupal Commons 的 http -> 重定向到 https (http://commons.acquia.com/) 地点。
由于 varnish 缓存了一些重定向(我认为是 R=301,但不是 R=302),我首先让重定向在 :8080 上工作,而 varnish 并不提供该服务。
以下 .htaccess 代码成功将 http://foo.example.com:8080 重定向至 https://foo.example.com。(适用于 Chrome、FF 和 Safari。)
# RewriteBase /
### Standard Drupal7 .htaccess above here ###
# SSL REWRITES
RewriteCond %{SERVER_PORT} ^8080$
RewriteRule ^(.*)$ https://foo.example.com/$1 [NC,R=302,L]
### Standard Drupal7 .htaccess below here ###
# Rewrite URLs of the form 'x' to the form 'index.php?q=x'.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</IfModule>
如果我
- 将上面的 8080 改为 80
- 保存 .htaccess
- 重启清漆
- 清除 Drupal 缓存
- 清除浏览器缓存
- 访问 http://foo.example.com
(每次编辑 .htaccess 后我都会虔诚地执行上述操作。)
当我访问 http://foo.example.com 时,Chrome、FF、Safari 中出现了重定向循环。
为了理解循环,我将重定向更改如下:
# SSL REWRITES
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ https://foo.example.com/$1/%{SERVER_PORT} [NC,R=302,L]
我在位置栏中看到了这个:https://foo.example.com/80/80/80/80/80/80/80/80/80/80/80/80/80/80/80/80/80/80/80/80/80/80/80
当浏览器转发到https url的时候,SERVER_PORT不应该是443吗???
更改为 R=301 会导致相同的循环。
测试 %{HTTPS} 会导致相同的循环。
# SSL REWRITES
#RewriteCond %{SERVER_PORT} ^80$
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://foo.example.com/$1/%{HTTPS} [NC,R=301,L]
现在我在位置栏中看到了这个:https:// foo.example.com/off/off/off/off/off/off/off/off/off/off/off/off/off/off/off/off/off/off/off/off/off/off/off/off/off
每http://drupal.org/node/181233#comment-278142(和http://drupal.org/node/823232#comment-3075288)我也尝试过:
# SSL REWRITES
RewriteCond %{SERVER_PORT} ^80$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ https://foo.example.com/$1/%{SERVER_PORT} [NC,R=301,L]
尝试过使用和不使用 ! 的 -f 和 -d 否定。无论哪种情况,条件都不匹配,所以什么都没有发生。我不知道为什么需要这些 -f、-d 测试......
我还尝试删除 RewriteRule 中的正则表达式替换
# SSL REWRITES
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^.*$ https://foo.example.com/ [R=301,L]
这仍然会导致循环。
任何帮助将非常感激。
答案1
我从服务器管理员那里得知,他们用 Pound 终止了此服务器上的 SSL。这意味着 SSL 可以工作,但 HTTP_SERVER 变量没有反映我预期的值。无论真实情况如何,SERVER_PORT 始终为 80,HTTPS 始终处于关闭状态。
使用 mod_rewrite 时,转储服务器变量以查看可以使用 RewriteCond 进行哪些测试。请参阅http://www.askapache.com/htaccess/crazy-advanced-mod_rewrite-tutorial.html#PHP_Code_access_Apache_Variables
您还可以使用大多数编程语言将 http 重定向到 https。我让 Drupal 的 443session 模块与此网站配合使用 - 它使用这种方法。(即使它无法检测到 HTTPS 已开启,我也不必告诉模块设置规则。)
确保你也使用了安全会话 cookie。除了 mod_ssl 之外,你还需要它们来防止会话劫持。
对于 Drupal 来说,这已经过时了,但很好http://drupalscout.com/knowledge-base/drupal-and-ssl-multiple-recipes-possible-solutions-https我认为drupal.org/project/443session是目前最好的模块选项。