web-dev-qa-db-ja.com

.htaccessを使用してHTTPとHTTPSを正しく切り替える

共有ホスト(Mediatemple Gridserver)でホストしているショッピングサイトがあります。サイトの一部ではHTTPS(チェックアウトなど)を使用する必要がありますが、残りの部分ではHTTPを使用する必要があります。

特定のURLに対して常にHTTP/HTTPSの正しい使用を強制する方法を誰かが知っていますか?さまざまな状態で機能しましたが、HTTP上にあるはずのページに対してリクエストを取得できませんが、HTTPSを使用してリクエストを正しく切り替えることができます。

SOを見回しましたが、これに対する適切な答えを見つけることができませんでした。

21
Alistair Holt

私はワードプレスの私の管理フォルダーにこれに似たものを使用します:

#redirect all https traffic to http, unless it is pointed at /checkout
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/checkout/?.*$
RewriteRule ^(.*)$ http://mydomain.com/$1 [R=301,L]

RewriteCond %{HTTPS} on部分は、すべてのWebサーバーで機能するとは限りません。私のウェブホストにはRewriteCond %{HTTP:X-Forwarded-SSL} on、 例えば。

逆を強制したい場合は、以下を試してください:

#redirect all http traffic to https, if it is pointed at /checkout
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/checkout/?.*$
RewriteRule ^(.*)$ https://mydomain.com/$1 [R=301,L]

別の方法で実行したい場合は、 askapache を確認してください。

38
Curtis Tasker

これはほとんどすべてのシナリオで機能し、実際のvhostまたは.htaccessで機能するはずです。

RewriteEngine on
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L]

(%{REQUEST_URI}の前のスラッシュを忘れないでください。これにより、ポート番号を渡すことができるため、危険です。)

15
Wil Moore III
RewriteEngine on
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L]

ロードバランサーの背後で問題が発生しました。この方法で修正しました。

6
Sjaak Wish

この答え で詳しく説明されているように、必要に応じてhttps://リンクを使用するようにアプリケーションを修正します。自動リダイレクトに依存しないでください。リンク/フォームをhttps://経由でhttps:// URLにもアクセスしたことがない場合、誤った安心感につながる可能性があります。 mod_rewriteを自動的に使用すると、そのような間違い(脆弱性の可能性もあります)の検出が困難になります。

1
Bruno

私のためにこれを働きました(wordpressサイトとHTTPSへのリダイレクトに使用しました)。RewriteEngineとRewriteBase行の直後に条件とルール行を追加する必要があります:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# I added these two lines for redirect to HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L]
# (end of custom modifications)

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress`

状態を見てくださいRewriteCond %{HTTP:X-Forwarded-Proto} !https-これが私のサーバーホスティングで機能しました。 (私は試した RewriteCond %{SERVER_PORT} !^443$またはRewriteCond %{HTTPS} offも同様ですが、成功しませんでした。

1
David Najman

私はそれがそうあるべきだと思います:

RewriteCond %{HTTPS}  =on
^/checkout(.*) http://shoppingsite.com/checkout$1 [R]

mod_rewrite のドキュメントを参照してください。

0