3

/ category /category-slug/のリクエストをcategory.phpに渡す.htaccessルールがあります。ただし、スーパーグローバルを調べると、次のエントリが表示されます。$_SERVER

Array
(
    [PATH_TRANSLATED] => redirect://
)

それは何ですか?私はこれまでredirect://を見たことがありません。

これは、関連する.htaccessルールです。

RewriteRule ^category/([^/]+)/?(.*) /category.php?cat=$1&page=$2 [L,QSA]

その結果、スクリプトがリダイレクトから来ているように見え、リクエストが単純に書き直されていないため、スクリプトが取得$_GET['cat']または入力されていません。$_GET['page']どうしたの?

4

3 に答える 3

2

同じ問題と思われるものについてのApacheバグレポート(40781)を見つけました。Bob Ionescuによるコメントを引用するには:

「問題は、メインリクエストのuri = path_infoを持つサブリクエスト(path_translated、つまりpath_infoの物理パスビューを取得するため)がディレクトリごとのコンテキストでRewriteRuleに再度ヒットし、一致することです。したがって、物理パスがありません。

これがApache2.0で発生しないのはなぜですか?答えは簡単です。mod_rewriteは、バージョン2.1より前のディレクトリごとのコンテキストのサブリクエストでは機能しません。NSフラグは、サブリクエストでのRewriteRulesの処理を防ぎます。」

コメントは、サブリクエストにもフラグを明示的に適用したい場合を除いて、[NS]フラグをに含めることでこの問題を修正できるはずであることを示唆しています。RewriteRule

于 2013-01-01T20:23:50.730 に答える
1

PATH_TRANSLATEDinは、いくつかの標準ルールに従って$_SERVER、PHP によってスーパーグローバルにインポートされるサーバーの環境変数です。$_SERVERしたがって、環境変数は、同じ名前ではないにしても同様です。

環境変数の名前だけでは、この値を正確に設定したとは言えませんが、質問のコンテキストは、Aapache HTTPD Web サーバーによって設定されたことを示唆しています。

于 2013-01-01T19:46:47.537 に答える
1

PHPのドキュメントには次のように書かれています。

PHP の以前の動作は、 に設定PATH_TRANSLATEDすることSCRIPT_FILENAMEであり、PATH_INFO が何であるかを理解していませんでした。[..]SCRIPT_FILENAMEではなく、使用するようにスクリプトを修正する必要がありますPATH_TRANSLATED

$_SERVER少し異なる注記も参照してください。

サーバーが仮想から実へのマッピングを行った後の、現在のスクリプトへのファイル システム (ドキュメント ルートではなく) ベースのパス。

注: PHP 4.3.2 の時点で、PATH_TRANSLATED は Apache 2 SAPI で暗黙的に設定されなくなりました。Apache 1 では、Apache によって設定されていない場合に SCRIPT_FILENAME サーバー変数と同じ値が設定されます。この変更は、PATH_INFO が定義されている場合にのみ PATH_TRANSLATED が存在する必要があるという CGI 仕様に準拠するために行われました。Apache 2 ユーザーは、httpd.conf内でAcceptPathInfo = Onを使用して PATH_INFO を定義できます。

すべての$_SERVER変数は環境から読み取られます。Apache + mod_php の場合、この環境は Apache サーバーによって定義されます。

正直なところ、私もredirect://今まで見たことがありませんでした。あなたのリクエストはこの書き換えルールに一致し、以前の別のルールには一致しませんか?

mod_rewrite は、エラーを探す場所だと思います。

ログを有効にすることで mod_rewrite の動作をデバッグできます

于 2013-01-01T20:11:48.303 に答える