4

これは、リクエスト URI に基づいて http requesd をディスパッチする必要があるディスパッチャー クラスを構築しているため、ドメインの背後にある URI の一部にのみ関心があります。

今、次のようなURIでライブサーバーで作業しているとき:

www.domain.com/controller/method/params/

REQUEST_URI は次を返します。

/controller/method/params/

しかし、私がローカルマシンで作業しているとき、私は次のようなURIを持っています:

localhost/project/controller/method/params/

REQUEST_URI は以下を返します。

/project/controller/method/params/

URIから必要なパラメータのみを取得するようにphpに指示するエレガントできちんとした方法はありますか?$_SERVER['REQUEST_URI'] である必要はありませんが、ライブ サーバーとローカル サーバーの両方で同じ文字列が必要ですか?

ありがとう!

Dispatcher は、現在のリクエスト URI を構成ファイルで定義された URI と比較します。ライブサーバーでは一致しますが、ローカルマシンではライブサーバーよりもセグメントが1つ多くなります。

どうすればこれに対処できますか?

4

4 に答える 4

3

通常、「test.mysite.com」に応答するようにローカル Web サーバーを構成し、hosts ファイルで test.mysite.com を 127.0.0.1 に設定します。これにより、実稼働環境をより適切にシミュレートでき、サブパスの使用を強制されません。 URLで

Apache Web サーバーを使用する場合は、N 個の仮想ホストを簡単にセットアップできます。

于 2012-04-11T16:25:19.030 に答える
1

パスが存在する場合は、URL の先頭からパスを削除するだけです。

$path = '/project/'; // for localhost/project/controller/method/params/
//$path = '/';       // for domain.tld/controller/method/params/

$url = getenv('REQUEST_URI');
if(strpos($url, $path) === 0)
{
    $url = str_replace($path, '', $url, 1);
}
print $url;

上記のコードはテストしていないので、"/" が間違っている可能性があります。必要に応じて、いつでも URL をトリミングできます$url = trim($url, '/')

于 2012-04-11T17:00:05.700 に答える
0

localhost が検出された場合は、組み込みのarray_shift()関数を使用します。

if ($_SERVER['HTTP_HOST'] == 'localhost') {
    $array_uri = explode('/', $_SERVER['REQUEST_URI']);
    array_shift($array_uri);
    $uri = $array_uri;
} else {
    $uri = explode('/', $_SERVER['REQUEST_URI']);
}
于 2016-09-15T21:17:31.243 に答える
0
$url = $_SERVER['REMOTE_ADDR'].$_SERVER['REQUEST_URI'];

それはあなたが望むものですか?

于 2012-04-11T16:33:16.790 に答える