2012-01-07 10 views
0

から正しいパスを取得するには、次のURLをご検討ください:PHPはURL

http://www.mydomain.com/a/test.php 
https://www.mydomain.org/a/b/test.php 
http://www.mydomain.co.nr/a/b/c/test.php 
https://www.mydomain.com/a/b/c/d/test.php 
http://www.mydomain.co.uk/a/b/c/d/e/test.php 
https://www.mydomain.co.au.nm/a/b/c/d/e/f/test.php?var1=test1&var2=test2 

は今、私はそれは、それぞれ以下の出力が含まれるようにtest.phpをファイルにACTUAL_URLと呼ばれる定数を宣言したい(これらのことを前提とします

http://www.mydomain.com/ 
https://www.mydomain.org/a/ 
http://www.mydomain.co.nr/a/b/ 
https://www.mydomain.com/a/b/c/ 
http://www.mydomain.co.uk/a/b/c/d/ 
https://www.mydomain.co.au.nm/a/b/c/d/e/ 

今すぐ次の場所にあるファイル、1.phpを考慮してください。URLは上記の順)に、それぞれのウェブサイトのメインディレクトリを表します

1.phpのためのPHPコードは次のようになります。注意すべき

//1.php 
//The folder name may remain as "a" or may change. 
//But for most cases, it will be "a" 
require_once('a/test.php'); 

//Rest of the code for the page 

いくつかのこと:

  1. は、理想的にはtest.phpを独自に実行されることはありません。むしろ、メインディレクトリ内の他のファイルおよび/またはサブディレクトリ内の他のファイルにインクルードされるインクルードファイルです。
  2. このコードは、受信したURLからhttpとhttpsを検出し、それを使用するのに十分スマートであることに注意してください。
  3. .comドメインまたは.co.nmnmドメインであり、正しくフェッチできます。
  4. $ _GET経由で受け取ったパラメータを削除します。

私は、次を試してみましたが、満足のいく答えを得るために失敗しました:

define("ACTUAL_URL", basename($_SERVER['PHP_SELF'])); 
define("ACTUAL_URL", dirname($_SERVER['PHP_SELF'])); 
define("ACTUAL_URL", $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]); 

最初の2がされていない、むしろ彼らは、フォルダの物理パスを提供するように見える、ウェブサイトのURLを提供いけません必須。私はアクセス可能なURLが必要です。 3番目のドメイン名はドメイン名+フォルダ(良い)ですが、現在実行中のページのファイル名とそれに関連する$ _GETパラメータが含まれています。 、私は一定のACTUAL_URLが私を与えたいと思う上記の場合

https://www.mydomain.co.au.nm/a/b/c/d/e/1.php?var1=test1&var2=test2 
https://www.mydomain.co.au.nm/a/b/c/d/e/f/test.php 

:たとえば、ウェブサイトでの私のファイルは、以下の構造を考慮し

https://www.mydomain.co.au.nm/a/b/c/d/e/ 

相対パスをtest.phpをします常に1.phpファイルに含まれています。

上記の機能をどのように達成できますか?

答えて

1

dirname()関数を2回使用することができます。一度ファイル名(および任意のクエリー文字変数)を取り除き、別のディレクトリを1つ上に移動します。

dirname(dirname($_SERVER["REQUEST_URI"])); 

これは、ウェブサイトのルートディレクトリにあるファイルでは機能しませんのでご注意ください。すべてのパスは少なくとも1つのフォルダの深さにする必要があります。

本当にこの全体的なアプローチは、セキュリティの観点から疑問があります。最終的に細断されてrequire_onceに渡される経路でクライアントを通過させると、アプリケーションはpath traversal attacksまで開かれます。これを行う場合は、入力を検証/サニタイズしてください。

+0

こんにちは、セキュリティ上の観点から、より良いソリューションを実装する方法を教えてください。ありがとう。 – Devner

+0

@Denver:パスプレフィックスの 'require_once'呼び出しまたはハードコード定数に相対パスを使用します。 – Asaph

+0

ありがとうございます。それは役に立ちます。 – Devner

0

parse_url機能を参照してください。それはあなたに良い出発点を与えるはずです。

+0

返事をありがとう。私はそれを徹底的に調べます。 – Devner