web-dev-qa-db-ja.com

いくつかを除いて、すべてのURLをhttpからhttps(301を使用)にリダイレクトします

.htaccessを使用して、すべてのURLをhttp://からhttps://に301リダイレクトしようとしています。一部の動的に生成されたURLは除外する必要があります。

私が行ういくつかのURLの例notリダイレクトしたい:

example.com/tt.php?xxx (where xxx can be any number)
example.com/top/xxx/site/xxx (where xxx can be any number or characters)

現在、私の.htaccessは次のようになっています。

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_Host} ^www\. [NC]
RewriteCond %{HTTP_Host} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]

動的URLを「除外」するにはどうすればよいですか?

3
Rogge

現在、私の.htaccessは次のようになっています。

.htaccessファイルにあるのがそれだけの場合は、除外するURLにいくつかの例外を含めることができますリダイレクトする既存のルール。

例えば:

# Prevent further processing if requesting a URL of the form
# example.com/tt.php?xxx (where xxx can be any number)
RewriteCond %{QUERY_STRING} ^\d+$
RewriteRule ^tt\.php$ - [L]

# Prevent further processing if requesting a URL of the form
# example.com/top/xxx/site/xxx (where xxx can be any number or characters)
RewriteRule ^top/[^/]+/site/ - [L]

上記の「例外」を配置することにより、firstその後、後続のディレクティブ(つまり、リダイレクト)はスキップされます。


PDATE:.htaccessファイルにこれらのURLに引き続き適用される他のディレクティブがある場合は、代わりに既存のリダイレクトルールに条件を追加できます。

例えば:

RewriteCond %{THE_REQUEST} !^[A-Z]{3,6}\s/tt\.php\?\d+\sHTTP
RewriteCond %{REQUEST_URI} !^/top/[^/]+/site/

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_Host} ^www\. [NC]
RewriteCond %{HTTP_Host} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]

最初の2つの条件には、その意味を否定するために、CondPattern!プレフィックスが付いていることに注意してください。したがって、この条件は、正規表現が一致する場合にのみ成功しますnot一致します。

最初の例で行ったように2つのディレクティブ(RewriteCondRewriteRule)を使用してURL /tt.php?xxxと照合する代わりに、これを1つのルールに結合し、THE_REQUESTと照合したことに注意してください。この1つのルールのロジックを単純化します。

THE_REQUESTサーバー変数は、HTTPリクエストの最初の行を保持します。

2
MrWhite