Bisakah saya membaca bagian hash dari URL pada aplikasi sisi server saya (PHP, Ruby, Python, dll.)?

217

Dengan asumsi URL:

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

PHP dapat membaca variabel permintaan val1menggunakan array GET.

Apakah nilai hash part2juga dapat dibaca? Atau ini hanya terserah browser dan JavaScript?

Kilat
sumber

Jawaban:

203

Masalah utama adalah bahwa browser bahkan tidak akan mengirim permintaan dengan bagian fragmen. Bagian fragmen diselesaikan di sana di browser. Jadi bisa dijangkau melalui JavaScript.

Bagaimanapun, Anda dapat mem-parsing URL menjadi bit, termasuk bagian fragmen, menggunakan parse_url () , tapi itu jelas bukan kasus Anda.

Ionuț G. Stan
sumber
98

Tes sederhana, mengakses 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 -

Server menerima permintaan tanpa lampiran # - apa pun setelah tag hash hanyalah pencarian jangkar pada klien.

Anda dapat menemukan nama jangkar yang digunakan dalam URL melalui javascript menggunakan, sebagai contoh:

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

Fungsi parse_url () di PHP dapat berfungsi jika Anda sudah memiliki string URL yang diperlukan termasuk fragmen ( http://codepad.org/BDqjtXix ):

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

Output: fizzbuzz

Tapi saya tidak berpikir PHP menerima informasi fragmen karena hanya untuk klien.

tom
sumber
48

Ini diambil dari Javascript - as window.location.hash. Dari sana Anda bisa mengirimnya ke server dengan Ajax misalnya, atau menyandikannya dan memasukkannya ke URL yang kemudian dapat diteruskan ke sisi server.

Alister Bulman
sumber
1
Terima kasih! Jadi agar lebih jelas, daripada ini: www.example.com/?val=1#part2 Anda harus mengarahkan ulang ke server, seperti ini: www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2 dan tentu saja Anda harus menambahkan dukungan untuk mengarahkan ke url lain di halaman lain Anda. Tidak mengagumkan, dan tentu saja tidak berfungsi untuk semua kasus penggunaan, tetapi berfungsi untuk bookmark. Perhatikan bahwa jika Anda melakukan ini, Anda tidak boleh mengizinkan pengalihan ke url absolut, hanya url relatif, untuk memastikan Anda tidak membuka diri terhadap pengalihan yang tidak aman
Brad Parks
25

Hash tidak pernah dikirim ke server, jadi tidak.

PatrikAkerstrand
sumber
8

Ya itu benar, server tidak mendapatkan jangkar. Namun ada solusi menggunakan cookie. Anda dapat menemukannya di sini: http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/

VangelisB
sumber
2
Ini "solusi" tidak berharga. Ada selusin teknik yang lebih baik jika Anda setuju dengan 2 permintaan per tampilan halaman.
umassthrower
11
Bagaimana itu tidak berharga? Ini jelas tidak berharga. Tapi mungkin ada teknik yang lebih baik. Itu bagus.
Kishor
Apa teknik yang lebih baik? Untuk google oauth saya memilikinya mengarahkan saya ke halaman api saya dengan hash akses token, kemudian saya melakukan "ajax inception" di mana saya membuat skrip ajax cepat yang ajax halaman yang sama tetapi dengan nilai hash saat ini sebagai parameter permintaan . Rasanya aneh .. mungkin ada cara yang lebih baik, tetapi semua cara yang saya lihat tampak
berantakan
7

Jawabannya adalah tidak.

Tujuan utama hash adalah untuk menggulir ke bagian tertentu dari halaman di mana Anda telah menetapkan bookmark. mis. Gulir ke Bagian ini ketika halaman dimuat.

Penelusuran akan menggulir sedemikian rupa sehingga baris ini adalah konten pertama yang terlihat di halaman, tergantung pada seberapa banyak konten yang mengikuti di bawah garis.

Ya javascript dapat mengaksesnya, dan kemudian panggilan ajax sederhana akan melakukan keajaiban

Qiniso
sumber
4

Bagaimana dengan:

Ambil hash # secara dinamis

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

Untuk membuatnya lebih lancar:

Contoh lengkap hanya menggunakan Javascript dan 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; ?> 
samjco
sumber
PHP masih belum mendapatkan nilai hash.
cornernote
solusi manis dan pendek.
Waruna Manjula
3

Saya pikir nilai hash hanya digunakan sisi klien, jadi Anda tidak bisa mendapatkannya dengan php.

Anda bisa mengarahkannya dengan javascript ke php.

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

Ini seharusnya bekerja

Keshav Kalra
sumber
JIKA Anda memiliki url sebagai string mudah, bahkan jika Anda menguraikannya dengan reg exp. Masalahnya adalah Anda tidak dapat mengakses # photo45 dari server (gunakan phpinfo () dan Anda tidak akan melihat # photo45 di mana saja
Nik Chankov
1

Bagian dari URI setelah #disebut "fragmen" dan menurut definisi hanya tersedia / diproses di sisi klien (lihat https://en.wikipedia.org/wiki/Fragment_identifier ).

Di sisi klien, ini dapat diakses menggunakan javaScript dengan window.location.hash.

MrTux
sumber
1

Ya kamu bisa:

Gunakan metode ini untuk mencegah kesalahan:

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

Dan tentu saja dalam PHP, meledak anak anjing itu dan dapatkan salah satu nilainya

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

Solusi lain adalah menambahkan bidang input tersembunyi ke halaman php:

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

Menggunakan javascript / jQuery Anda dapat mengatur nilai bidang ini pada pemuatan halaman atau merespons suatu peristiwa:

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

Dalam php di sisi server Anda dapat membaca nilai ini menggunakan koleksi $ _POST:

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

Kita dapat melakukannya dengan pendekatan lain juga, Seperti pertama-tama dapatkan nilai hash dari js dan panggil ajax menggunakan parameter itu dan dapat melakukan apa pun yang kita inginkan

Keshav Kalra
sumber