8

リクエスト URI を URL 変数として 404 ページに送信する方法はありますか? たとえば、ErrorDocumentディレクティブを使用して 404 を転送する場合、このような方法はありますか? これは私が試したコードですが、明らかに機能しませんでした。

ErrorDocument 404 /pages/errors/index.php?e=404&url=%{REQUEST_URI}

mod_rewrite も試しましたが、うまくいきませんでした。mod_rewriteで試したのは次のとおりです。

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /pages/errors/index.php?e=404&url=%{REQUEST_URI} [L,R=404]

基本的に私がやろうとしているのは、ユーザーが次のようなものを入力すると、ディレクトリがサーバーに存在しないと仮定してhttp://mysite.com/asdf転送することです。http://mysite.com/pages/errors/index.php?e=404&url=/asdf/asdf

これを達成する簡単な方法はありますか?

4

6 に答える 6

3

それがあなたの質問に関するものであれば、エラーハンドラースクリプトに追加情報を渡す必要はないと思います。Apache は十分な情報を提供します。

別の URL へのリダイレクトは便利ですが、エラー状態をより明確に説明または記録するために使用できる情報を渡すことができる場合に限ります。

これを実現するために、エラー リダイレクトが送信されると、追加の環境変数が設定されます。この環境変数は、元のヘッダー名の先頭に「REDIRECT_」を追加することで、元の要求に提供されたヘッダーから生成されます。これにより、エラー ドキュメントに元の要求のコンテキストが提供されます。

たとえば、より一般的な環境変数に加えて、次のようなものを受け取る場合があります。

REDIRECT_HTTP_ACCEPT= /、画像/gif、画像/jpeg、画像/png

REDIRECT_HTTP_USER_AGENT=Mozilla/5.0 Fedora/3.5.8-1.fc12 Firefox/3.5.8

REDIRECT_PATH=.:/bin:/usr/local/bin:/sbin

REDIRECT_QUERY_STRING=

REDIRECT_REMOTE_ADDR=121.345.78.123

REDIRECT_REMOTE_HOST=client.example.com

REDIRECT_SERVER_NAME=www.example.edu

REDIRECT_SERVER_PORT=80

REDIRECT_SERVER_SOFTWARE=Apache/2.2.15

REDIRECT_URL=/cgi-bin/buggy.pl

REDIRECT_ 環境変数は、リダイレクト前に存在していた環境変数から作成されます。それらは REDIRECT_ プレフィックスで名前が変更されます。つまり、HTTP_USER_AGENT は REDIRECT_HTTP_USER_AGENT になります。

REDIRECT_URL、REDIRECT_STATUS、および REDIRECT_QUERY_STRING は確実に設定され、その他のヘッダーは、エラー状態になる前に存在していた場合にのみ設定されます。

ErrorDocument ターゲットが外部リダイレクト (サーバーと同じホストを参照していても、http: のようなスキーム名で始まるもの) の場合、これらはいずれも設定されません。

このリンクを確認してください

于 2013-01-26T02:17:20.217 に答える
2

を取り除く必要があると思いますR=404。これは私にとってはうまくいきました。

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php?e=404&url=%{REQUEST_URI} [L]

テスト: foo/index.php:print_r($_GET)

localhost/foo -> Array ( )

localhost/foo/asdf -> Array ( [e] => 404 [url] => /foo/asdf )

于 2013-01-26T02:38:08.617 に答える
0

あなたはphpを使用しているので、なぜにアクセスしないのですか$_SERVER['HTTP_REFERER']?これは、以前のページ リクエストを示しているため、おそらく探しているものとまったく同じです。そこから、その値でやりたいことができます。それは動作しますか?

于 2013-01-26T01:59:12.190 に答える
0

rewritecond による rewriterule の前に存在するファイル/フォルダーを既にチェックしています。rewritecond で request uri を使用して処理する必要はありません。$_SERVER['REQUEST_URI']

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /pages/errors/index.php?e=404 [L,R=404]
于 2013-01-26T02:10:01.147 に答える