web-dev-qa-db-ja.com

WWWへの非WWWリダイレクトおよびSSLへの非SSL-htaccess

WordpressサイトをwwwからWWWに、SSLからSSLに完全にリダイレクトしようとしています。

私が使用しているコードは次のとおりです。

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301] 

RewriteEngine On
RewriteCond %{HTTP_Host} ^example\.com [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]

コードが正しいのか、それとももっと良い方法ができるのか疑問に思います。つまり、うまくいくように見えますが、PageSpeedは、このような多くのリダイレクトを避けるべきだと言っています。

編集:だからそれはそのように見えるはずです:

RewriteEngine On
RewriteCond %{HTTP_Host} ^example\.com [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301] 

EDIT2:

RewriteEngine On

RewriteCond %{HTTP_Host} ^static.example\.com [NC]
RewriteRule (.*) https://static.example.com/$1 [L,R=301]

RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [L,R=301] 
3
kacper3355

HSTS を実装する場合は、完全に問題なく、同じホストでHTTPSにリダイレクトすることにより、そのように実装する必要があります。

ただし、http://example.comを要求するときに二重リダイレクトを排除するには、これら2つのルールを逆にする必要があります。そうしないと、次の二重リダイレクトが発生します。

  • http://example.comからhttps://example.com tohttps://www.example.com

例えば:

RewriteEngine On

RewriteCond %{HTTP_Host} ^example\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [L,R=301]

RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [L,R=301] 

RewriteEngineディレクティブを繰り返す必要はありません。

置換で使用されていない場合、後方参照(つまり、(.*))をキャプチャする必要はありません。アンカー^および$は、正規表現がデフォルトで貪欲なので、必要ありません。

上記の規則間のもう1つの「スタイル」の不一致は、最初のRewriteRuleでキャプチャされた後方参照($1)を使用し、2番目でREQUEST_URIサーバー変数を使用していることです。 2つの異なる方法で同じことを行うため、動作に違いはありません。しかし、それらは2つの異なる「スタイル」です(2人の異なる人々によって書かれたように)。


EDIT2:

サブドメインもあります-static.example.com(www以外)。ここにSSLを追加し、WWWを非WWWにリダイレクトします(現在、ユーザーはwwwからもサイトにアクセスでき、最終的にwww.static.example.comなどのURLになります)。 EDIT2のようなものを試しました(投稿を編集したばかりです)。そのコードの何が問題なのか教えてもらえますか?

RewriteCond %{HTTP_Host} ^static.example\.com [NC]
RewriteRule (.*) https://static.example.com/$1 [L,R=301]

RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

ここでの最初のルールは、static.example.comstatic.example.comにリダイレクトすることです(つまり、変更なし)-これにより、自然に終わることのないリダイレクトループが発生します(ブラウザーは最終的にエラーで中断します)。

fromwww.static.example.comをリダイレクトする場合は、RewriteCondディレクティブでこれを確認する必要があります。例えば:

RewriteCond %{HTTP_Host} ^www\.static\.example\.com [NC]
RewriteRule (.*) https://static.example.com/$1 [L,R=301]

あなたがそうであるかどうかはわかりませんが、HTTPからHTTPSへのリダイレクトを繰り返す必要はありません-ディレクティブを正しい順序に並べてください。

したがって、要約すると、両方のリダイレクトが一緒になります:

RewriteEngine On

# Main domain non-www to www redirect
RewriteCond %{HTTP_Host} ^example\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [L,R=301]

# Subdomain www to non-www redirect
RewriteCond %{HTTP_Host} ^www\.static\.example\.com [NC]
RewriteRule (.*) https://static.example.com/$1 [L,R=301]

# HTTP to HTTPS redirect
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [L,R=301] 
2
MrWhite