スクリプトの実行前に$ _SERVER ['REDIRECT_URL']をグローバルに設定できますか?


8

現在、多くのサイトを古いサーバー構成から新しいサーバー構成に移行しています。各サイトは、mod_rewrite URLを使用して、類似した(残念ながら同一ではない)コードベースに基づいています。

  • Ubuntu 8.04 LTS => Ubuntu 12.04 LTS
  • Apache 2.22.8 => Apache 2.2.22
  • PHP 5.2(FastCGI)=> PHP 5.3(PHP5-FPM)

ほとんどはチャームのように機能しますが、新しい構成では$ _SERVER ['REDIRECT_URL']が設定されなくなり、このグローバル変数への依存が原因でコードが失敗します。

私の理解では、この変数はリダイレクトが発生したときにApacheによって設定されます。明らかにこれは現在起こっていませんが、原因を見つけるのに苦労しています。

  • それはApacheのアップグレードですか、(私の推測では)PHP FastCGIからPHP5-FPMへの切り替えですか?
  • この変数を元に戻すにはどうすればよいですか?

各サイトのコードを編集する必要はないので、必要に応じてグローバルなPHP auto_prependを設定しますが、理想的にはサーバー構成を修正し、これを最初に設定したいと思います。

潜在的に関連:私は今、いくつかの新しい$ _SERVER変数、つまりREDIRECT_SCRIPT_URLとREDIRECT_REDIRECT_SCRIPT_URLも持っています。これらはREDIRECT_URLに必要な正しいデータを持っているようですが、以前にはなかった2つの内部リダイレクトが発生していることも示しているようです-REDIRECT_REDIRECT_SCRIPT_URLを検索すると、ランダムなvar_dump出力しか返されません。SCRIPT_URLは新しいREDIRECT_URLですか?

編集1

再チェックREDIRECT_URLは(現在)設定されていますが、予想される型付きURLではなく、常に 'index.php'(mod_rewriteターゲット)に設定されています。PHP auto_prepend_fileを使用して、必要な変数を手動で設定しました。

初めて見逃したかどうかはわかりませんが、その間にいくつかの変更を加えたので、そこにない可能性が外部にあると思います。これが誰かを誤解させるならば、謝罪してください。

編集2

以下のErrorDocumentの言及に対処するために、使用されているmod_rewriteルールは次のとおりです。

RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]

$ _GET ['url']変数が設定されているため、ルールが機能している必要があります。

明確にするために、この段階では、最初に述べたauto_prepend_fileの回避策を使用しました。


デューデリジェンスを示さなかった場合は-1。クイックGoogle検索は、ドキュメントを読むことに代わるものではありません。システムまたはコードをアップグレードする前に、少なくともシステムまたはプロジェクトに影響する限り、変更点を理解しておく必要があります。
ジョンガーデニア

明確でないことをお詫びします。できる限りドキュメントを読みました。それから私は私が説明できない何かに出くわしたときにグーグルに頼りました。構成は別のマシンにあり、移動前のテスト中に上記の問題を発見しました。しかし、間違いを見つけたので、質問を更新します。
2012

これらのことを前もって教えていただければ、それは本当にあなたにとっても私たちにとっても最善のことです。反対票を投じました。
ジョンガーデニアス2012

以前のサーバー構成と新しいサーバー構成の詳細を教えていただけますか?PHPのREDIRECT_URLの設定は、ApacheのSCRIPT_URL環境変数に由来すると思いますが、そのインポートの動作を変更する可能性のあるものはたくさんあります(たとえば、suPHP、ラッピングエンジン、AddTypeHandlerステートメントなど)。
Jon Kloske、2012

回答:


3

REDIRECT_URLは、Apache Webサーバーによってのみ、特定の状況でのみ設定されます。それはおそらくあなたのコードが依存すべきものではありません。私の知る限り、最善の解決策はバグのあるPHPコードを修正することです。これをApacheで常に設定するように強制することはできません。


残念ながら、そのリンクに私の問題に関連するものは何も見つかりませんでしたが、応答をありがとう。外部のErrorDocumentがこれに関与しているとは思いません。既存のコードを変更したいのですが、それは現時点ではオプションではありません。
バリー

ポイントは、REDIRECT_URLはErrorDocument処理中にのみ設定されることです。つまり、PHPスクリプトは元の構成でErrorDocumentsとしてロードされ、それらを作成した人は誰でもこの動作に依存していました。それが起こっていないので、スクリプトは壊れます。
マイケルハンプトン

使用中のErrorDocument定義はありません。また、mod_rewrite RewriteRule(上記で追加)がどのように関係しているかはわかりません。REDIRECT_URLが保証されていないことについて、私はあなたに同意しません。理由について、関連するドキュメントを見つけることができません。
バリー

私は私の回答で上記にリンクしました。さらに何かが必要な場合は、Apacheソースコードを読む必要があります。とにかく、問題の解決策の横にあるチェックマークのアウトラインをクリックして回答を受け入れ、サーバーフォールトへようこそ。
マイケルハンプトン

0

PHPのドキュメントによると:

$ _SERVERは、ヘッダー、パス、スクリプトの場所などの情報を含む配列です。この配列のエントリは、Webサーバーによって作成されます。すべてのWebサーバーがこれらのいずれかを提供するという保証はありません。サーバーは一部を省略したり、ここに記載されていないものを提供したりする場合があります。とはいえ、これらの変数の多くは»CGI / 1.1仕様で説明されているため、それらを期待できるはずです。

したがって、すべての$_SERVERスーパーグローバル変数が、予想されるほどプラットフォームに依存しないわけではないようです。$_SERVER['REQUEST_URI']すべての主要なWebサーバーで一貫して定義されている値の1つであると思われるため、代わりにそれを使用してみてください。


ありがとうございましたが、これが設定されている場合と設定されていない場合があることはすでに知っていました。私が望んでいたのは、自分の構成に基づいた詳細に関するドキュメント(つまり、環境構築の前に知る方法)が見つからないため、特定の構成に設定される変数に積極的に影響を与える方法です。
バリー

0

index.phpにリダイレクトされた私たちのプロジェクトの1つで欠けている画像の場合、この修正を使用しました。

url:http : //www.domanXY.de/image.php? file = var/binaries/store/8dfaadde-5309-4a35-8f9a-d8b9cd807aae.jpg&options = &options = resize_outer( 320,150) ; sharpen( 64) ;

<?php
//image.php (newly created)
$_SERVER['REDIRECT_URL'] = "image.php";
include "index.php";

グローバルソリューションが必要な場合は、explode()などを使用し、$ _ SERVER ['REQUEST_URI']のような別の変数を使用する必要があると思います。


-1

この変数を設定するPHPコードの小さなスニペットを含めるようにphp auto-prepend-fileを設定できます。


私の質問では、これが不可能であった場合に私がとるべき行動方針としてすでに特定しました。あなたが答える前に私が行った編集によると、それは私がやったことでもありました。
バリー

申し訳ありませんが、投稿する前に編集内容を見た覚えはありません。あなたが編集する前に返信を始めた可能性がありますが、その後の編集で元の編集の日付スタンプが削除されているため、確信が持てません:/ 「フォールバック」ではなく、目的を達成します。[E:blah = blah]フラグを書き換えルールに使用して任意の環境変数を設定し、GET変数を使用してリダイレクトエンジンからコードにデータを渡すよりもクリーンなプリインクルードファイル内でフェッチできます。
Jon Kloske、2012

そして、「おそらく正しい」ということは、私が過去にいくつかの場所でこの正確なことを行った方法であることを意味します。
Jon Kloske、2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.