異なる URI で特定の書き換えを行う htaccess ファイル

異なる URI で特定の書き換えを行う htaccess ファイル

.htaccess私のファイルには次の内容が含まれています:

<IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine On

    # Block hidden directories
    RewriteRule "(^|/)\." - [F]

    # Prevent /health_check.php from using https
    RewriteCond %{REQUEST_URI} !(health_check\.php)$

    # Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
    RewriteCond %{REQUEST_URI} !^/(sns)/

    # Reroute http to https
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

    # Prevent rewriting of domain for codeigniter
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

</IfModule>

一部を除いてすべて正常に動作しているようです/sns。 https へのリダイレクトを停止することはできません。

https にリダイレクトしないようにしたいhttp://sub.example.com/snsと思います。http://sub.example.com/health_check.php

答え1

# Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
RewriteCond %{REQUEST_URI} !^/(sns)/

リクエストURLが末尾のスラッシュで終わらない場合(前述の通り)、上記のルール(末尾のスラッシュを含む)が適用されます。条件パターン)は常に成功します(それは否定された条件)であるため、HTTPS へのリダイレクトは常に発生します。

理想的には、リクエストの前のほうで末尾のスラッシュを正規化する必要があります。末尾のスラッシュを含めるか含めないかは自由です(そうでない場合は、基本的に重複コンテンツURL を解析する他のスクリプトで問題が発生する可能性があります。

ただし、2 つの URL を処理するには/sns/sns/末尾のスラッシュをオプションにして、文字列の末尾のアンカー ( ^) を含める必要があります。次に例を示します。

RewriteCond %{REQUEST_URI} !^/sns/?$

これは、指定された 2 つの URL にのみ一致することに注意してください。 形式の URL には一致しません/sns/<something>

パス セグメントを囲む括弧を削除しました (正規表現内の他の括弧も削除する必要があります)。これにより、キャプチャされたグループが作成され、投稿したディレクティブでは不要になります。

アップデート:書き換えられた URL (つまり/index.php/sns) がリダイレクトされないことを確認するための追加チェックも必要になります。追加の条件を含めることで、書き換えられたリクエストではなく、最初のリクエストにのみ HTTPS リダイレクトを適用することで、これをより一般的な方法で実行できます。

# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$

環境REDIRECT_STATUS変数は、最初の書き換えが成功した後 (つまり、CodeIgniter ルーティング後)、「200」に設定されます。最初のリクエストでは設定されません (つまり、^$空の文字列)。

それでもリダイレクトが発生する場合は、CodeIgniter 自体がリダイレクトをトリガーしている可能性があります (.htaccess処理された後)。

RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

余談:そして私のコメントに書いたように./RewriteRule 代替を参照してください私の答えはこれで終わりですの上このStackOverflowの質問説明のために。

まとめ

Options +FollowSymlinks
RewriteEngine On

# Block hidden directories
RewriteRule ^\. - [F]

# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$

# Prevent /health_check.php from using https
RewriteCond %{REQUEST_URI} !health_check\.php$

# Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
RewriteCond %{REQUEST_URI} !^/sns/?$

# Reroute http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Prevent rewriting of domain for codeigniter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

HTTP から HTTPS へのリダイレクトは、最終的には 301 (永続的) リダイレクトになるはずですが、正常に動作していることが確認できた場合に限ります。Rフラグ自体はデフォルトで 302 (一時的) リダイレクトになります。

<IfModule>(サイトが mod_rewrite なしで動作することを意図していない限り、ラッパーも必要ありません。)

関連情報