web-dev-qa-db-ja.com

正規表現条件が否定された.htaccessのRewriteCondが機能しませんか?

この場合、WordPressが特定のURLを書き換えないようにしています。この場合、uploadsディレクトリのリクエストを処理しないようにし、代わりにサーバーの404ページに残します。だから私はそれがルールを追加するのと同じくらい簡単であると仮定しています:

RewriteCond %{REQUEST_URI} !^/wp-content/uploads/

このルールはfalseと評価され、それらのリクエストに対して一連のルールが失敗するため、書き換えが停止します。しかし、いいえ...おそらく、表現の文字列全体をカバーと一致させる必要がありますか?

RewriteCond %{REQUEST_URI} !^/wp-content/uploads/.*$

いいえ、それもそうではありません。頭を掻いた後、正気のチェックをします。おそらく、実際のパターンに問題があります。だから私は簡単なテストケースを作ります。

RewriteCond %{REQUEST_URI} ^/xyz/$

この場合、要求されたURLが/ xyz /であり、サーバーの他のページの404ページを表示する場合にのみ、書き換えが発生します。これはまさに私が期待していたことです。だから私はに固執するよ!そのパターンを無効にします。

RewriteCond %{REQUEST_URI} !^/xyz/$

今、私は上記の条件の正反対が表示されることを期待しています。書き換えは/ xyz /ではなく、他のすべての可能なURLに対して行われる必要があります。代わりに、/ xyz /とその他の両方のすべてのURLで書き換えが行われます。

したがって、RewriteCondsで否定された正規表現の使用がApacheで壊れているか、それについて私が理解していない根本的な何かがあります。どちらですか?

サーバーはApache2です。

ファイル全体:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteBase /
RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/wp-content/uploads/
RewriteRule . /index.php [L]
</IfModule>

WordPressのデフォルトファイルとルール。

17
nitro2k01

だから、いらいらした後、私は問題を理解しました。結局のところ、私の元の質問のルールは、実際には想定されていたとおりのことを行いました。同様に、同じことを行う他の多くの方法もありました。

RewriteRule ^wp-content/uploads/.*$ - [L]

(パターンが一致する場合、ルールに最後のマークを付ける)または

RewriteRule ^wp-content/uploads/.*$ - [S=1]

(パターンが一致する場合は次のルールをスキップします)また、前述のように質問の否定されたルール。これらのルールはすべて正常に機能し、書き直さずに制御をApacheに戻しました。

これらのルールが処理された後に問題が発生しました。代わりに、ホストが提供したデフォルトの404.shtml、403.shtmlなどのテンプレートを削除したことが問題でした。 .htaccessの書き換えがない場合は、問題なく動作します。サーバーは独自のデフォルトの404ページを表示し、すべてが機能します。 (少なくとも私はそう思っていましたが、実際には「ErrorDocumentを使用してリクエストを処理しようとしたときに404 Not Foundエラーが発生しました」という二重エラーでした。)

一方、.htaccessがある場合は、404ページに対して2回目に実行されます。ページが存在する場合はそれが使用されますが、代わりに404.shtmlのリクエストがキャッチオールルールによってキャッチされ、index.phpに書き直されました。この理由で、私がここや他の場所で得た他のすべての提案はすべて失敗しました。結局、404ページがindex.phpに書き直されたためです。

したがって、解決策は単にエラーテンプレートを復元することでした。振り返ってみると、それらを削除するのはかなり愚かでしたが、私はこの「ゼロから始める」という考え方を持っています。一見不必要に横たわっているようなものは欲しくない。少なくとも今、私は何が起こっているのかを理解しています。

最後にセシルへのコメント:私は何かへのアクセスを禁止したくなかった、ただ書き直しが行われるのをやめなさい。今はそれほど重要ではありませんが、私はこれを明確にしたかっただけです。

7
nitro2k01
<IfModule mod_rewrite.c>
RewriteEngine On

RewriteBase /
RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_URI} !^/wp-content/uploads/ [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . /index.php [L]
</IfModule>
10
Cecil

/wp-content/uploads/が実際にリクエストされたURIパスのプレフィックスである場合、ルールは期待どおりに機能するはずでした。

しかし、それが機能しないことは明らかなので、完全なURIパスのパスプレフィックスと一致しないようにします。ドキュメントルートディレクトリの.htaccessファイルの場合は、コンテキストパスごとのパスプレフィックスを除いた残りのパスのみURIパス先行/なし:

RewriteCond $0 !^wp-content/uploads/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .+ /index.php [L]

それでもうまくいかない場合は、その logging feature を使用して、mod_rewriteの書き換えプロセスを理解することは確かに役立ちます。したがって、RewriteLogLevelを少なくとも4のレベルに設定し、要求を行って、ログファイルの RewriteLog で指定されたエントリを確認します。 mod_rewriteがリクエストをどのように処理するかがわかり、RewriteLogLevelが4以上の場合は、%{REQUEST_URI}のような変数の値もわかります。

3
Gumbo

「WordPress First」アプローチをとるとき、私はこのような多くの例を見つけました。たとえば、以下を追加します。

ErrorDocument 404 /error-docs/404.html

.htaccessファイルにメッセージを処理します(「さらに、404 Not Foundエラー...」)。

0
cbos