ฉันสามารถอ่านส่วนแฮชของ URL ในแอปพลิเคชันฝั่งเซิร์ฟเวอร์ของฉัน (PHP, Ruby, Python และอื่น ๆ ) ได้หรือไม่


217

สมมติว่า URL ของ:

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

PHP สามารถอ่านตัวแปรคำขอval1โดยใช้อาร์เรย์ GET

ค่าแฮชpart2สามารถอ่านได้ด้วยหรือไม่ หรือมากกว่าเบราว์เซอร์และ JavaScript เท่านั้นหรือไม่

คำตอบ:


203

ปัญหาหลักคือเบราว์เซอร์จะไม่ส่งคำขอที่มีส่วนย่อย ส่วนของแฟรกเมนต์ได้รับการแก้ไขตรงนั้นในเบราว์เซอร์ ดังนั้นจึงสามารถเข้าถึงได้ผ่าน JavaScript

อย่างไรก็ตามคุณสามารถแยก URL เป็นบิตรวมถึงส่วนแฟรกเมนต์โดยใช้parse_url ()แต่ก็ไม่ใช่กรณีของคุณ


98

ทดสอบอย่างง่ายโดยเข้าถึงhttp: // localhost: 8000 / hello? foo = bar # this-is-not-send-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 - อะไรก็ได้หลังจากแท็กแฮชเป็นเพียงการค้นหาจุดยึดบนไคลเอ็นต์

คุณสามารถค้นหาชื่อสมอที่ใช้ภายใน URL ผ่านทางจาวาสคริปต์โดยใช้ตัวอย่าง:

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

ฟังก์ชัน parse_url () ใน PHP สามารถทำงานได้หากคุณมีสตริง URL ที่ต้องการอยู่แล้วรวมถึงส่วน ( http://codepad.org/BDqjtXix ):

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

Output: fizzbuzz

แต่ฉันไม่คิดว่า PHP ได้รับข้อมูลส่วนเพราะเป็นลูกค้าเท่านั้น


48

มันเป็นเอากลับคืนจาก Javascript - window.location.hashเป็น จากตรงนั้นคุณสามารถส่งไปยังเซิร์ฟเวอร์ที่มี Ajax หรือเข้ารหัสแล้วใส่ลงใน URL ซึ่งสามารถส่งผ่านไปยังฝั่งเซิร์ฟเวอร์


1
ขอบคุณ! เพื่อให้ชัดเจนแทนที่จะเป็นเช่นนี้www.example.com/?val=1#part2 คุณต้องเปลี่ยนเส้นทางไปที่เซิร์ฟเวอร์เช่นนี้ www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2 และแน่นอนคุณต้องเพิ่มการสนับสนุนเพื่อเปลี่ยนเส้นทางไปยัง URL อื่นในหน้าอื่น ๆ ของคุณ ไม่น่ากลัวและใช้ไม่ได้กับทุกกรณีการใช้งาน แต่ทำงานได้กับบุ๊กมาร์ก โปรดทราบว่าหากคุณทำเช่นนี้คุณไม่ควรอนุญาตให้เปลี่ยนเส้นทางไปยัง URL แบบสัมบูรณ์ซึ่งเป็นเพียง URL แบบสัมพัทธ์เท่านั้นเพื่อให้แน่ใจว่าคุณไม่ได้เปิดรับการเปลี่ยนเส้นทางที่ไม่ปลอดภัย
Brad Parks


8

ใช่มันเป็นความจริงเซิร์ฟเวอร์ไม่ได้รับส่วนยึด อย่างไรก็ตามมีวิธีแก้ไขปัญหาโดยใช้คุกกี้ คุณสามารถค้นหาได้ที่นี่: http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/


2
"วิธีแก้ปัญหา" นี้ไม่มีค่า มีเทคนิคที่ดีกว่าโหลถ้าคุณโอเคกับ 2 คำขอต่อการดูหน้าเว็บ
umassthrower

11
มันไร้ค่าอย่างไร? มันไม่คุ้มค่าแน่นอน แต่อาจมีเทคนิคที่ดีกว่านี้ก็ดี
Kishor

เทคนิคที่ดีกว่าคืออะไร? สำหรับ google oauth ของฉันฉันได้เปลี่ยนเส้นทางให้ฉันไปยังหน้า api ของฉันด้วยแฮ็กโทเค็นการเข้าถึงจากนั้นฉันจะทำ "ajax inception" โดยที่ฉันสร้างสคริปต์ ajax อย่างรวดเร็วที่ ajaxes หน้าเดียวกัน แต่ด้วยค่าแฮชในครั้งนี้ . มันรู้สึกแปลก ๆ .. อาจมีวิธีที่ดีกว่า แต่วิธีการทั้งหมดที่ฉันเคยเห็นดูเหมือนจะ
แฮ็

7

คำตอบคือไม่

วัตถุประสงค์หลักของการแฮชคือเพื่อเลื่อนไปยังส่วนหนึ่งของหน้าเว็บที่คุณกำหนดบุ๊คมาร์คไว้ เช่นเลื่อนไปที่ส่วนนี้เมื่อโหลดหน้าเว็บ

การเรียกดูจะเลื่อนเพื่อให้บรรทัดนี้เป็นเนื้อหาแรกที่มองเห็นได้ในหน้าทั้งนี้ขึ้นอยู่กับจำนวนเนื้อหาที่อยู่ด้านล่างบรรทัด

ใช่จาวาสคริปต์สามารถ acces มันและจากนั้นโทร 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 ยังไม่ได้รับค่าแฮช
cornernote

ทางออกหวานและสั้น
Waruna Manjula

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 เป็นสตริงนั้นเป็นเรื่องง่ายแม้ว่าคุณจะวิเคราะห์ด้วย exp exp ปัญหาคือคุณไม่สามารถเข้าถึง # photo45 จากเซิร์ฟเวอร์ (ใช้ phpinfo () และคุณจะไม่เห็น # photo45 ที่ใดก็ได้
Nik Chankov

1

ส่วนหนึ่งของURIหลังจากที่#เรียกว่า "แฟรกเมนต์" และเป็นคำจำกัดความพร้อมใช้งาน / ประมวลผลทางฝั่งไคลเอ็นต์เท่านั้น (ดูhttps://en.wikipedia.org/wiki/Fragment_identifier )

บนฝั่งไคลเอ็นต์นี้สามารถเข้าถึงได้โดยใช้ JavaScript window.location.hashกับ


1

ใช่คุณสามารถ:

ใช้วิธีนี้เพื่อป้องกันข้อผิดพลาด:

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

และแน่นอนใน PHP ระเบิดลูกสุนัขตัวนั้นและรับค่าใดค่าหนึ่ง

$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.