web-dev-qa-db-ja.com

Httpsへのリダイレクトが.htaccessで機能しない

私の.htaccessファイルには以下の設定がありますが、http:経由で私のサイトに行くことはまだ可能です。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# Rewrite HTTP to HTTPS
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*) https://%{SERVER_NAME}/$1 [R,L]
</IfModule>

# END WordPress

私が悪いことをしている可能性があるという考えはありますか?

1

あなたはコードを間違った場所に置いた。 HTTPからHTTPSへのディレクティブはWordPressフロントコントローラの前にを付けなければなりません。そうでなければ、直接ファイルリクエスト以外の目的で処理されることは決してありません。

カスタムディレクティブも# BEGIN WordPressブロックの外側にある必要があります。そうしないと、将来のアップデートでWordPress自体がディレクティブをオーバーライドする可能性があります。

例えば:

# Redirect HTTP to HTTPS
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]    
</IfModule>
# END WordPress

それは「書き換え」ではなく「リダイレクト」です。正常に動作していることが確実な場合は、RR=301に変更します(これは最終的にはpermanentredirect)になるはずです)。

1
MrWhite

Mod_rewriteの[L]フラグに精通していますか?これは、「mod_rewriteにルールセットの処理を停止させます。ほとんどの場合、これは、ルールが一致すると、それ以上ルールが処理されないことを意味します」。

参照してください: https://httpd.Apache.org/docs/2.4/rewrite/flags.html#flag_l

Http-> httpsルールより上の書き換えルールではこのフラグが使用されていることに注意してください。これらの規則は、特定のファイルまたはディレクトリに対するものではない要求を処理のためにindex.phpにリダイレクトするWordPressの規則のように見えます。

1つのアイデアは、最初のhttp-vs-httpsチェックが実行され、次のリダイレクトされたリクエストに対してthenが実行されるように、Rewrite Engine Onの後にルールが表示されるように順序を変更することです。 WordPressの機能に関連する次の一連の規則が適用されます。

より明示的にするためにRewriteCond {HTTPS} != onRewriteCond %{HTTPS} offRewriteRule行をRewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]と書き、http 301(恒久的)リダイレクトステータスコードを送り返すこともできます。

編集:私はちょうどMrWhiteのコメントを見た、私たちは同時に書いていた。彼はまた、良いアドバイスをしています:あなたの修正されたルールを#WORDPRESSコメントブロックの外側に置いて、将来のWordPressの更新がそれらを駄目にしないように!

1
firxworx