GET引数なしで要求されたファイルまたはディレクトリを取得する簡単な方法はありますか?たとえば、URLがhttp://mysite.com/directory/file.php?paramater=value
の場合、http://mysite.com/directory/file.php
のみを返します。 $_SERVER[]
に単純なインデックスがないことに驚きました。見逃しましたか?ありがとう!
$_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
別の代替方法 here 。
(回答をよりわかりやすくするために、その回答に賛成票を投じてください)。
最も簡単な解決策は次のとおりです。
echo parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
Parse_urlは組み込みのphp関数です。この関数の唯一の目的は、PATH
(最初の?
)。そのため、この問題に対する私の新しい「最良の」ソリューションです。
Stackoverflow:クエリ文字列を削除してURLのみを取得する方法
strtok を使用して、?が最初に現れる前に文字列を取得できます。
$url=strtok($_SERVER["REQUEST_URI"],'?');
パフォーマンス注:この問題は explode を使用して解決することもできます。
文字の最初のインスタンスの前に文字列内のすべてを返すこのstrtokのアプリケーションは、クエリ文字列をメモリに残しますが、PHPの他のメソッドanyよりも優れたパフォーマンスを発揮します。
OPはそれについて尋ねませんでしたが、言及する価値があると思います:parse_urlshould URLから特定のコンポーネントを抽出します。その関数のドキュメントを参照してください。
parse_url($actual_link, PHP_URL_SCHEME);
ここで注意すべきことは、リクエストから完全なURLを取得することは簡単な作業ではなく、セキュリティに多くの影響があることです。 $_SERVER
変数はここではあなたの友人ですが、Apache/nginxの設定、PHP環境、さらにはクライアントでさえ、これらの変数を省略または変更できるため、気まぐれな友人です。これらはすべてこの質問の範囲外ですが、徹底的に議論されています。
解決:
echo
parse_url
($_SERVER["REQUEST_URI"], PHP_URL_PATH);
さまざまなポートと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'];
私は実際にそれを解析する良い方法ではないと思います。それはきれいではないか、少し主題から外れています...
私は次のようなことをします...
if ($pos_get = strpos($app_uri, '?')) $app_uri = substr($app_uri, 0, $pos_get);
私のWebサイトのURI/URLとして$ app_uriを検討します。
これらの投票された/受け入れられた答えのうちどれだけが不完全であるかは衝撃的であるため、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'];
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を取得します
誰もがそれを簡単に見つけるとは限りませんが、私はこれを回避する最善の方法であると信じています:
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を再ルーティングするときに機能することが確認されています。
私はこれが古い投稿であることを知っていますが、私は同じ問題を抱えており、このように解決しました
$current_request = preg_replace("/\?.*$/","",$_SERVER["REQUEST_URI"]);
または同等に
$current_request = preg_replace("/\?.*/D","",$_SERVER["REQUEST_URI"]);
$uri_parts = explode('?', $_SERVER['REQUEST_URI'], 2);
$request_uri = $uri_parts[0];
echo $request_uri;
なぜそんなに複雑なのですか? =)
$baseurl = 'http://mysite.com';
$url_without_get = $baseurl.$_SERVER['PHP_SELF'];
これは本当にそれを行う必要があります;)