web-dev-qa-db-ja.com

サーバーサイドアプリケーション(PHP、Ruby、Pythonなど)でURLのハッシュ部分を読み取ることはできますか?

次のURLを想定:

www.example.com/?val=1#part2

PHPは、GET配列を使用してリクエスト変数val1を読み取ることができます。

ハッシュ値part2も読み取り可能ですか?または、これはブラウザとJavaScriptのみに依存していますか?

209
Robinicks

主な問題は、ブラウザがフラグメント部分を含むリクエストを送信しないことです。フラグメント部分は、ブラウザですぐに解決されます。そのため、JavaScriptを介して到達可能です。

とにかく、 parse_url() を使用して、フラグメント部分を含むビットにURLを解析できますが、明らかにそうではありません。

194
Ionuț G. Stan

http:// localhost:8000/hello?foo = bar#this-is-not-sent-to-server にアクセスする簡単なテスト

python -c "import SimpleHTTPServer;SimpleHTTPServer.test()"
Serving HTTP on 0.0.0.0 port 8000 ...
localhost - - [02/Jun/2009 12:48:47] code 404, message File not found
localhost - - [02/Jun/2009 12:48:47] "GET /hello?foo=bar HTTP/1.1" 404 -

サーバーは#appendageなしでリクエストを受信します-ハッシュタグの後は、クライアント上の単なるアンカールックアップです。

例として、javascriptを使用してURL内で使用されるアンカー名を見つけることができます。

<script>alert(window.location.hash);</script>

フラグメントを含む必要なURL文字列が既にある場合は、PHPのparse_url()関数が機能します( http://codepad.org/BDqjtXix ):

<?
echo parse_url("http://foo?bar#fizzbuzz",PHP_URL_FRAGMENT);
?>

Output: fizzbuzz

しかし、PHPはクライアント専用であるため、フラグメント情報を受け取るとは思わない。

96
tom

window.location.hashのように、Javascriptから取得できます。そこから、たとえばAjaxを使用してサーバーに送信するか、エンコードしてURLに入れてからサーバー側に渡すことができます。

48
Alister Bulman

ハッシュがサーバーに送信されることはありませんので、いいえ。

25

はい、それは事実です。サーバーはアンカー部分を取得しません。ただし、Cookieを使用する回避策があります。ここにあります: http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/

8
VangelisB

答えはノーだ。

ハッシュの主な目的は、ブックマークを定義したページの特定の部分にスクロールすることです。例えばページがロードされたら、このパートまでスクロールします。

この行がページの下に続くコンテンツの量に応じて、この行がページの最初の表示コンテンツになるようにブラウズがスクロールします。

はい、javascriptはアクセスできます。その後、単純なajax呼び出しで魔法をかけます

7
Qiniso Mdletshe

ハッシュ値はクライアント側でのみ使用されるため、PHPで取得することはできません。

ただし、javascriptを使用してphpにリダイレクトできます。

3
Silfverstrom

どうですか:

#hashを動的に取得

<script>
var urlhash = window.location.hash, //get the hash from url
    txthash = urlhash.replace("#", ""); //remove the #
    //alert(txthash);
</script>

<?php
$hash = "<script>document.writeln(txthash);</script>";
echo $hash;
?>

より流makeにするには:

JavascriptとPHPのみを使用した完全な例

<script>
var urlhash = window.location.hash,  //get the hash from url
txthash = urlhash.replace("#", "");  //remove the #

function changehash(a,b){
   window.location.hash = b; //add hash to url
   //alert(b); //alert to test
   location.reload(); //reload page to show the current hash
}
</script>

<?php $hash = "<script>document.writeln(txthash);</script>";?>

<a onclick="changehash(this,'#hash1')">Change to #hash1</a><br/>
<a onclick="changehash(this,'#hash2')">Change to #hash2</a> 

<?php echo "This is the current hash: " . $hash; ?> 
2
samjco

はい、できます:

この方法を使用して、エラーを防ぎます。

<script> 
query=location.hash;
document.cookie= 'anchor'+query;
</script>

そしてもちろん、PHPでは、その子犬を爆発させて、値の1つを取得します

$split = explode('/', $_COOKIE['anchor']);
print_r($split[1]); //to test it, use print_r. this line will print the value after the anchortag
2
Aurora

#の後の URI のTh部分は「フラグメント」と呼ばれ、定義上、クライアント側でのみ利用可能/処理されます( https://en.wikipedia.org/wikiを参照)/Fragment_identifier )。

クライアント側では、window.location.hashでjavaScriptを使用してアクセスできます。

1
MrTux
<?php
$url=parse_url("http://domain.com/site/gallery/1?user=12#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
?>

これは動作するはずです

1
Keshav Kalra

別のアプローチでもそれを行うことができます。まず、jsからハッシュ値を取得し、そのパラメーターを使用してajaxを呼び出し、何でもできます

0
Keshav Kalra

別の解決策は、非表示の入力フィールドをphpページに追加することです。

<input type="hidden" id="myHiddenLocationHash" name="myHiddenLocationHash" value="">

Javascript/jQueryを使用して、ページの読み込み時またはイベントへの応答時にこのフィールドの値を設定できます。

$('#myHiddenLocationHash').val(document.location.hash.replace('#',''));

サーバー側のphpでは、$ _ POSTコレクションを使用してこの値を読み取ることができます。

$server_location_hash = $_POST['myHiddenLocationHash'];
0
Matteo Conta