web-dev-qa-db-ja.com

.htaccessをhttpからhttpsに書き換えると、ループが発生します

ワニスを実行しているApache2.2サーバーで、http->をhttpsにリダイレクトしようとしていますDrupal Commons( http://commons.acquia.com/ ) 地点。

ワニスはいくつかのリダイレクトをキャッシュするので(R = 301ですが、R = 302ではないと思います)、最初にリダイレクトを:8080で機能させましたが、これはワニスによって提供されていません。

以下の.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>

もし私が

  1. 上記の8080を80に変更します
  2. .htaccessを保存します
  3. ニスを再起動します
  4. Drupalキャッシュをクリアする
  5. ブラウザのキャッシュをクリアする
  6. 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

ブラウザがhttpsURLに転送されるとき、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

あたり 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]

これでもループが発生します。

どんな助けでも大歓迎です。

5
Brian Wood

サーバー管理者から、このサーバーでSSLをPoundで終了していることがわかりました。つまり、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が現在最良のモジュールオプションだと思います。

1
Brian Wood