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


217

以下のURLを想定しています。

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

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

ハッシュ値part2も読み取り可能ですか?それとも、ブラウザとJavaScriptまでしかありませんか?

回答:


203

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

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


98

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>

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

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

Output: fizzbuzz

しかし、PHPはクライアントのみであるため、フラグメント情報を受信しないと思います。


48

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


1
ありがとう!明確にするために、これの代わりにwww.example.com/?val=1#part2 、次のようにサーバー上でリダイレクトする必要があります。 www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2 もちろん、他のページの他のURLにリダイレクトするためのサポートを追加する必要があります。すばらしいわけではなく、もちろんすべてのユースケースで機能するわけではありませんが、ブックマークでは機能します。これを行う場合、危険なリダイレクトに
Brad Parks


8

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


2
この「回避策」は無意味です。ページビューごとに2つのリクエストで問題がなければ、12の優れたテクニックがあります。
umassthrower、2012年

11
それはどのように無価値ですか?これは間違いなく価値がありません。しかし、もっと良いテクニックがあるかもしれません。
キショー

より良いテクニックは何ですか?私のgoogle oauthの場合、アクセストークンハッシュを使用してapiページにリダイレクトし、「ajax inception」を実行します。ここでは、同じページをajaxするクイックajaxスクリプトをレンダリングしますが、今回はハッシュ値を要求パラメーターとして使用します。 。変な感じがします。おそらくもっと良い方法があるでしょうが、私が見たすべての方法は
ハッキリして

7

答えはいいえだ。

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

ブラウズは、この行がページの最初に表示されるコンテンツになるようにスクロールします。

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


4

何について:

#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;
?>

より流暢にするには:

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')" style="text-decoration: underline;cursor: pointer;" >Change to #hash1</a><br/>
<a onclick="changehash(this,'#hash2')" style="text-decoration: underline;cursor: pointer;">Change to #hash2</a><br/> 

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

PHPはまだハッシュ値を取得しません。
コーナーノート

甘くて短い解決策。
ワルナマンジュラ

3

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

ただし、JavaScriptを使用してphpにリダイレクトすることもできます。


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

これはうまくいくはずです


文字列としてのURLがあれば、正規表現で解析しても簡単です。問題は、サーバーから#photo45にアクセスできないことです(phpinfo()を使用すると、どこにも#photo45が表示されません
Nik Chankov


1

はい、できます:

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

<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

0

別の解決策は、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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.