web-dev-qa-db-ja.com

RewriteCondは、特定のURIを書き換えないようにします

URL短縮(YOURLS)を使用しており、リンク処理スクリプトにリダイレクトされない特定のページを作成しようとしています。元の.htaccessは次のとおりです。

# BEGIN YOURLS
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
# THE LINE I'M ADDING
# RewriteCond %{REQUEST_URI} !^/InvalidLink\.html$
RewriteRule ^.*$ /yourls-loader.php [L]
</IfModule>
# END YOURLS
RewriteCond %{HTTP_Host} ^www\.example\.com$
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)$ "http\:\/\/example\.com\/$1" [R=301,L]

RewriteRule行の直前に新しい条件を追加しました(上記でコメントし、指摘しています):

RewriteCond %{REQUEST_URI} !^/InvalidLink\.html$

http://example.com/InvalidLink.htmlが無視されるようにします。しかし、これは違いはありません。ここで何が間違っていますか?

2
lfk
# THE LINE I'M ADDING
# RewriteCond %{REQUEST_URI} !^/InvalidLink\.html$

追加する条件に「間違った」ものはありません。要求されたURLが/InvalidLink.html(大文字と小文字を区別する一致)であり、この.htaccessファイルがドキュメントルートにあり、ブラウザーのキャッシュがクリアされている場合テスト前。だから、これはまだパズルです。 NCフラグを追加してみてください-ケースに不一致がある場合、たとえば:

RewriteCond %{REQUEST_URI} !^/InvalidLink\.html$ [NC]

このファイルを最初に作成すると、exceptionが「機能する」という事実。この場合、最初の条件(!-f)によって書き換えが防止されます。 、ファイルが正常に処理され、キャッシュがクリアされていることを示しています。そして、上記の条件に問題があること。ただし、投稿した内容からは大丈夫です!?

既存のルールに条件を追加する代わりに、ファイルの上部に別の「例外」を作成することもできます。したがって、「リクエストが/InvalidLink.htmlに対するものではない場合、URLを書き換える」と言う代わりに、「URLが/InvalidLink.htmlである場合、ここで停止し、それ以上何もしない」という別のルールを追加できます。

したがって、条件の代わりに、ファイルの先頭に別のルールを含めます。

RewriteRule ^InvalidLink\.html$ - [NC,L]

ディレクトリごとの.htaccessファイルのRewriteRulepatternにはスラッシュプレフィックスがないことに注意してください。これは/InvalidLink.htmlと一致し、次のmod_rewriteディレクティブが処理されないようにします。理想的には、NCフラグは必要ないはずですが、「念のため」に含めました。


これは上記の主な問題の本当に副次的なものです...

RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$

このcarbuncleは、「Let's Encrypt」SSL証明書を実装するときに、すべてのRewriteRuleの前にcPanelが自動的に追加するものです。非常に面倒で、 cPanelフォーラムでの多くの議論 を削除または変更するよう要求しています。 (ファイルの先頭に単一のコードブロック/例外を追加できないのは謎です。)

とにかく、暫定的に、これらのディレクティブは(ファイル全体で)安全に削除できます-証明書がインストールされた後は必要ありません。これにより、ディレクティブが簡素化され、ファイルが読みやすくなります(潜在的な競合を回避します)。ただし、証明書が更新されると(3か月ごと)、cPanelはこれらのディレクティブを後で自動的に再追加します。

RewriteCond %{HTTP_Host} ^www\.example\.com$
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)$ "http\:\/\/example\.com\/$1" [R=301,L]

前述のように、中間条件は安全に削除できます。ただし、この正規リダイレクトは間違った場所にあります!ファイルの最上部にある必要があります。そうしないと、短縮されたURLはどれも正規化されません。要するに、cPanelは.htaccessファイルの編集にはあまり適していません(信頼性がありません)。

概要

上記をすべてまとめると、既存の.htaccessファイルを次のように書き換えることができます。

RewriteEngine On

# Canonical www to non-www redirect
RewriteCond %{HTTP_Host} ^www\.(.+) [NC]
RewriteRule (.*) http://%1/$1 [R=301,L]

# Exceptions - avoid these URLs being rewritten
RewriteRule ^InvalidLink\.html$ - [NC,L]

# BEGIN YOURLS
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /yourls-loader.php [L]
# END YOURLS

<IfModule>ラッパーは必要ありません。そして、RewriteBaseディレクティブは不要でした。 .*^.*$と同じです。 RewriteRulesubstitutionの文字をエスケープするバックスラッシュは不要です(これは「典型的なcPanel」です)。

1
MrWhite