Tôi có thể đọc phần băm của URL trên ứng dụng phía máy chủ của mình không (PHP, Ruby, Python, v.v.)?


217

Giả sử một URL của:

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

PHP có thể đọc các biến yêu cầu val1bằng cách sử dụng mảng GET.

Là giá trị băm part2cũng có thể đọc được? Hay đây chỉ là trình duyệt và JavaScript?

Câu trả lời:


203

Vấn đề chính là trình duyệt thậm chí sẽ không gửi yêu cầu với một phần. Phần phân đoạn được giải quyết ngay trong trình duyệt. Vì vậy, nó có thể truy cập thông qua JavaScript.

Dù sao, bạn có thể phân tích URL thành các bit, bao gồm cả phần phân đoạn, sử dụng parse_url () , nhưng rõ ràng đó không phải là trường hợp của bạn.


98

Kiểm tra đơn giản, truy cập 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 -

Máy chủ nhận được yêu cầu mà không cần #appendage - bất cứ điều gì sau thẻ băm chỉ đơn giản là tra cứu neo trên máy khách.

Bạn có thể tìm thấy tên neo được sử dụng trong URL thông qua javascript bằng cách sử dụng, làm ví dụ:

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

Hàm parse_url () trong PHP có thể hoạt động nếu bạn đã có chuỗi URL cần thiết bao gồm cả đoạn ( http://codepad.org/BDqjtXix ):

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

Output: fizzbuzz

Nhưng tôi không nghĩ PHP nhận được thông tin phân đoạn vì nó chỉ dành cho khách hàng.


48

Nó có thể truy xuất từ ​​Javascript - như window.location.hash. Từ đó, bạn có thể gửi nó đến máy chủ với Ajax chẳng hạn, hoặc mã hóa nó và đặt nó vào các URL mà sau đó có thể được chuyển qua phía máy chủ.


1
Cảm ơn! Vì vậy, để rõ ràng, thay vì điều này: www.example.com/?val=1#part2 Bạn phải chuyển hướng đến nó trên máy chủ, như thế này: www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2 và tất nhiên bạn phải thêm hỗ trợ để chuyển hướng đến url khác trong trang khác của bạn. Không tuyệt vời, và tất nhiên không hoạt động cho tất cả các trường hợp sử dụng, nhưng không hoạt động cho dấu trang. Lưu ý rằng nếu bạn làm điều này, bạn không nên cho phép chuyển hướng đến các url tuyệt đối, chỉ các url tương đối, để đảm bảo bạn không mở ra các chuyển hướng không an toàn
Brad


8

Đúng vậy, máy chủ không nhận được phần neo. Tuy nhiên, có một cách giải quyết bằng cách sử dụng cookie. Bạn có thể tìm thấy nó ở đây: http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/


2
"Cách giải quyết" này là vô giá trị. Có hàng tá kỹ thuật tốt hơn nếu bạn ổn với 2 yêu cầu cho mỗi lần xem trang.
umassthrower

11
Làm thế nào là nó vô giá trị? Điều này chắc chắn là không có giá trị. Nhưng có thể có kỹ thuật tốt hơn. Điều đó tốt.
Kishor

Các kỹ thuật tốt hơn là gì? Đối với google của tôi, tôi có nó chuyển hướng tôi đến trang api của tôi với hàm băm truy cập, sau đó tôi thực hiện "ajax inception" trong đó tôi đưa ra một tập lệnh ajax nhanh xuất hiện trên cùng một trang nhưng với giá trị băm lần này là tham số yêu cầu . Cảm giác thật kỳ lạ .. có lẽ có nhiều cách tốt hơn, nhưng tất cả những cách tôi thấy có vẻ như hacky
Gisheri

7

Câu trả lời là không.

Mục đích chính của hàm băm là cuộn đến một phần nhất định của trang nơi bạn đã xác định dấu trang. ví dụ: Di chuyển đến Phần này khi tải trang.

Trình duyệt sẽ cuộn sao cho dòng này là nội dung hiển thị đầu tiên trong trang, tùy thuộc vào số lượng nội dung theo sau dòng.

Có javascript có thể gia nhập nó, và sau đó một cuộc gọi ajax đơn giản sẽ làm nên điều kỳ diệu


4

Thế còn:

Tự động lấy #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;
?>

Để làm cho nó trôi chảy hơn:

Ví dụ đầy đủ chỉ sử dụng Javascript và 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 vẫn không nhận được giá trị băm.
cornernote

giải pháp ngọt và ngắn.
Waruna Manjula

3

Tôi nghĩ rằng giá trị băm chỉ được sử dụng phía máy khách, vì vậy bạn không thể lấy nó bằng php.

bạn có thể chuyển hướng nó bằng javascript sang php.


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

Đây là công việc nên làm


NẾU bạn có url như chuỗi là dễ dàng, ngay cả khi bạn phân tích cú pháp bằng reg exp. Vấn đề là bạn không thể truy cập # photo45 từ máy chủ (sử dụng phpinfo () và bạn sẽ không thấy # photo45 ở bất cứ đâu
Nik Chankov 3/03/2015

1

Phần của một URI sau #được gọi là "đoạn" và theo định nghĩa chỉ có sẵn / được xử lý ở phía máy khách (xem https://en.wikipedia.org/wiki/Fragment_identifier ).

Về phía khách hàng, điều này có thể được truy cập bằng javaScript với window.location.hash.


1

Có bạn có thể:

Sử dụng phương pháp này để ngăn ngừa lỗi:

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

Và tất nhiên trong PHP, nổ tung con chó con đó và nhận được một trong những giá trị

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

0

Một giải pháp khác là thêm một trường đầu vào ẩn vào trang php:

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

Sử dụng javascript / jQuery, bạn có thể đặt giá trị của trường này khi tải trang hoặc trả lời một sự kiện:

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

Trong php ở phía máy chủ, bạn có thể đọc giá trị này bằng cách sử dụng bộ sưu tập $ _POST:

$server_location_hash = $_POST['myHiddenLocationHash'];

0

Chúng ta cũng có thể làm điều đó với một cách tiếp cận khác, Giống như trước hết hãy lấy giá trị băm từ js và gọi ajax bằng tham số đó và có thể làm bất cứ điều gì chúng ta muốn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.