0

特定のページにリダイレクトしたり、他のルールが満たされていない場合に 404 をスローしたりするにはどうmod_rewriteすればよいですか? これが私の.htaccessファイルにあるものです:

RewriteEngine on

RewriteRule ^\. / [F,QSA,L]
RewriteRule ^3rdparty(/.*)$ / [F,QSA,L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^((images|upload)/.+|style.css)$ $1 [L]

RewriteRule ^$ special [QSA]
RewriteRule ^(special|ready|building|feedback)/?$ $1.php [QSA,L]
RewriteRule ^(ready|building)/(\d+)/?$ show_property.php?type=$1&property_id=$2 [QSA,L]

RewriteRule . error.php?code=404 [QSA,L]

これは、とりわけ、ユーザーがerror.phpここで明示的に指定されていないものにアクセスしようとした場合に送信することになっています (ちなみに、404 をスローする適切な方法は何ですか?)。ただし、代わりに、すべてのページから にユーザーを送信しますerror.php。最後のルールを削除すると、他のすべてが機能します。

私は何を間違っていますか?

4

5 に答える 5

1

何が起こっているかというと、書き換えを行っているときに、ユーザーを新しい URL に送信し、そこでこれらの書き換えルールが再度評価されるということです。最終的に、他のリダイレクト ルールはトリガーされず、最終的なルールに到達し、常に error.php ページにリダイレクトされます。

したがって、これが起こらないように、いくつかの書き換え条件を設定する必要があります。

于 2012-08-21T21:17:37.120 に答える
1

書き換えエンジンはループするため、最終的に error.php に書き換える前に、成功した書き換えをパススルーする必要があります。たぶん次のようなもの:

RewriteCond %{REQUEST_URI} !^/$
RewriteCond %{REQUEST_URI} !^/(special|ready|building|feedback|show_property)\.php
RewriteCond %{REQUEST_URI} !^/((images|upload)/.+|style.css)$
RewriteRule ^ error.php?code=404 [QSA,L,R=404]

各条件は、URI が他のルールによって書き換えられたものではないことを確認します。

R=404404 Not Found」として error.php ページにリダイレクトされます。


残念ながら、それは機能しませんでした - サーバー上のすべてのファイルへのアクセスを許可します (おそらくすべての条件が満たされる必要があるため)。別の解決策を試しました:

空白の htaccess ファイルで最後にルールとこれらをテストしたところ、うまくいくように見えますが、何か他のものがすり抜けているに違いありません。あなたが試すことができる他の何かは少し良くありませんが、実際にはブラウザをどこにもリダイレクトしないため、クライアントから隠されます.

すべてのルールの最後にフラグがありQSA、ルールを適用した後に一意のパラメーターをクエリ文字列に追加し、それに対してチェックすることができます。例:

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^((images|upload)/.+|style.css)$ $1?_ok [L,QSA]

最後に:

RewriteCond %{QUERY_STRING} !_ok
RewriteRule ^ error.php?code=404&_ok [QSA,L,R=404]    
于 2012-08-21T21:17:45.660 に答える
0

ここでの問題はmod_rewrite、URLの書き換えが完了した後、mod_rewrite別のパスのためにに再送信されることです。したがって、[L]フラグはルールを現在のパスで最後にするだけです。この質問でよりよく説明されているようにmod_rewrite、Apacheバージョン2.3.9以降[END]では、現在のmod_rewriteパスを最後のフラグにする別のフラグ-がサポートされるようになりました。Apache 2.2にはいくつかのソリューションが提供されていますが、そのうちの1つは少し不器用で、もう1つは機能しなかったため、現在のソリューションは、すべてに404を送信しながら、特定のファイルセットにアクセスできるようにする2つのルールを追加することです。そうしないと:

RewriteRule ^((images|upload)/.+|style.css|(special|ready|building|feedback|property).php)$ - [QSA,L]
RewriteRule .* - [QSA,L,R=404]
于 2012-08-23T10:30:32.150 に答える
0

理論的には、一致するルールがない場合 (および要求された URL が存在しない場合)、それは既に 404ErrorDocumentです。

RewriteEngine On

ErrorDocument 404 /404.php
RewriteRule ^404.php$ error.php?code=404 [L]

# All your other rules here...

他の HTTP エラー コードについても同じことができます。

于 2012-08-21T21:27:53.093 に答える
-1

あなたの最後のルールは

RewriteRule ^(.*)$ error.php?code=404&query=$1 [QSA,L]

括弧と $1 パラメーターを省略することもできますが、ユーザーが何を達成しようとしたかを知ると役立つ場合があります。

うまくいけば、これでうまくいきます!

于 2012-08-21T21:11:06.847 に答える