web-dev-qa-db-ja.com

PHPでGET引数のないリクエスト文字列

GET引数なしで要求されたファイルまたはディレクトリを取得する簡単な方法はありますか?たとえば、URLがhttp://mysite.com/directory/file.php?paramater=valueの場合、http://mysite.com/directory/file.phpのみを返します。 $_SERVER[]に単純なインデックスがないことに驚きました。見逃しましたか?ありがとう!

41
Nathan

$_SERVER['REQUEST_URI']を使用して、要求されたパスを取得できます。次に、パラメータを削除する必要があります...

$uri_parts = explode('?', $_SERVER['REQUEST_URI'], 2);

次に、ホスト名とプロトコルを追加します。

echo 'http://' . $_SERVER['HTTP_Host'] . $uri_parts[0];

http:https://を混在させる場合は、プロトコルも検出する必要があります。 私はあなたのための練習として残します。 $_SERVER['REQUEST_SCHEME']はプロトコルを返します。


すべてを一緒に入れて:

echo $_SERVER['REQUEST_SCHEME'] .'://'. $_SERVER['HTTP_Host'] 
     . explode('?', $_SERVER['REQUEST_URI'], 2)[0];

...戻り、例えば:

http://example.com/directory/file.php


php.comドキュメント:

  • $_SERVER —サーバーおよび実行環境の情報
  • explode —文字列を文字列で分割する
  • parse_url — URLを解析し、そのコンポーネントを返します(代替ソリューション)

別の代替方法 here

51
Brad

編集:@ T.Toduaは、parse_urlを使用して、より新しい この質問への回答 を提供しました。

(回答をよりわかりやすくするために、その回答に賛成票を投じてください)。

Edit2:誰かがスキームの抽出についてスパムしているので、それを一番下に追加しました。

parse_url ソリューション

最も簡単な解決策は次のとおりです。

echo parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);

Parse_urlは組み込みのphp関数です。この関数の唯一の目的は、PATH(最初の?)。そのため、この問題に対する私の新しい「最良の」ソリューションです。

strtok ソリューション

Stackoverflow:クエリ文字列を削除してURLのみを取得する方法

strtok を使用して、?が最初に現れる前に文字列を取得できます。

$url=strtok($_SERVER["REQUEST_URI"],'?');

パフォーマンス注:この問題は explode を使用して解決することもできます。

  • Explodeは、単一の区切り文字でのみスリングを分割する場合にパフォーマンスが向上する傾向があります。
  • Strtokは、複数の区切り文字を使用する場合にパフォーマンスが向上する傾向があります。

文字の最初のインスタンスの前に文字列内のすべてを返すこのstrtokのアプリケーションは、クエリ文字列をメモリに残しますが、PHPの他のメソッドanyよりも優れたパフォーマンスを発揮します。

Schemeについての余談(http/https)

OPはそれについて尋ねませんでしたが、言及する価値があると思います:parse_urlshould URLから特定のコンポーネントを抽出します。その関数のドキュメントを参照してください。

parse_url($actual_link, PHP_URL_SCHEME); 

ここで注意すべきことは、リクエストから完全なURLを取得することは簡単な作業ではなく、セキュリティに多くの影響があることです。 $_SERVER変数はここではあなたの友人ですが、Apache/nginxの設定、PHP環境、さらにはクライアントでさえ、これらの変数を省略または変更できるため、気まぐれな友人です。これらはすべてこの質問の範囲外ですが、徹底的に議論されています。

https://stackoverflow.com/a/6768831/1589379

77
Tony Chiboucas

解決:

echoparse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);

36
T.Todua

さまざまなポートとhttpsを考慮したソリューションを次に示します。

$pageURL = (@$_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';

if ($_SERVER['SERVER_PORT'] != '80')
  $pageURL .= $_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['PHP_SELF'];
else 
  $pageURL .= $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'];  

または、他のポートを考慮しないより基本的なソリューション:

$pageURL = (@$_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';
$pageURL .= $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; 
2
Ravean

私は実際にそれを解析する良い方法ではないと思います。それはきれいではないか、少し主題から外れています...

  • 爆発が重い
  • セッションが重い
  • PHP_SELFはURLRewritingを処理しません

私は次のようなことをします...

if ($pos_get = strpos($app_uri, '?')) $app_uri = substr($app_uri, 0, $pos_get);
  • これは、実際の「?」があるかどうかを検出します(GET標準形式)
  • 大丈夫なら、 '?'の前に変数をカットします。データを取得するために予約されています

私のWebサイトのURI/URLとして$ app_uriを検討します。

2
Laurent

これらの投票された/受け入れられた答えのうちどれだけが不完全であるかは衝撃的であるため、7年後にはOPの質問に答えません!

  • 次のようなURLのページにいる場合:http://example.com/directory/file.php?paramater=value

  • ...そして、あなただけを返したい:http://example.com/directory/file.php

  • 次に使用します:

    echo $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'];

1
ashleedawg

Urlパラメータには$_GETを、postパラメータには$_POSTを使用できますが、$_REQUESTには$_GET$_POSTおよび$_COOKIEのパラメータが含まれます。ユーザーからURIパラメーターを非表示にする場合は、次のようにセッション変数に変換できます。

<?php

session_start();
if (isset($_REQUEST['param']) && !isset($_SESSION['param'])) {

    // Store all parameters received
    $_SESSION['param'] = $_REQUEST['param'];

    // Redirect without URI parameters
    header('Location: /file.php');
    exit;
}
?>
<html>
<body>
<?php
  echo $_SESSION['param'];
?>
</body>
</html>

[〜#〜] edit [〜#〜]

$_SERVER['PHP_SELF']を使用して現在のファイル名を取得するか、$_SERVER['REQUEST_URI']を使用して要求されたURIを取得します

0
JKirchartz

誰もがそれを簡単に見つけるとは限りませんが、私はこれを回避する最善の方法であると信じています:

preg_match('/^[^\?]+/', $_SERVER['REQUEST_URI'], $return);
$url = 'http' . ('on' === $_SERVER['HTTPS'] ? 's' : '') . '://' . $_SERVER['HTTP_Host'] . $return[0]


[。 (実際には、パラメータに到達したときにのみ発生するはずです)。

次に、URLを作成して$ urlに保存します。
$ urlを作成するとき...私たちがしていることは、単に "http"を記述し、httpsが使用されているかどうかを確認することです。 "、HTTP_Host(サーバー、fx:" stackoverflow.com ")を連結し、前に見つけた$ returnを連結します(配列ですが、最初のインデックスのみが必要です...正規表現の文字列の先頭からチェックしているため、インデックスは1つだけです。

誰かがこれを使用できることを願っています...

PS。これは、SLIMを使用してURLを再ルーティングするときに機能することが確認されています。

0
RasmusLD

私はこれが古い投稿であることを知っていますが、私は同じ問題を抱えており、このように解決しました

$current_request = preg_replace("/\?.*$/","",$_SERVER["REQUEST_URI"]);

または同等に

$current_request = preg_replace("/\?.*/D","",$_SERVER["REQUEST_URI"]);
0
user5379368
$uri_parts = explode('?', $_SERVER['REQUEST_URI'], 2);
$request_uri = $uri_parts[0];
echo $request_uri;
0
mahfuz

なぜそんなに複雑なのですか? =)

$baseurl = 'http://mysite.com';
$url_without_get = $baseurl.$_SERVER['PHP_SELF'];

これは本当にそれを行う必要があります;)

0
androidavid