क्या मैं अपने सर्वर-साइड एप्लिकेशन (PHP, Ruby, Python, आदि) पर URL का हैश भाग पढ़ सकता हूँ?


217

का URL मानकर:

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

val1GET सरणी का उपयोग करके PHP अनुरोध चर को पढ़ सकता है ।

क्या हैश मूल्य part2भी पठनीय है? या यह केवल ब्राउज़र और जावास्क्रिप्ट तक है?

जवाबों:


203

मुख्य समस्या यह है कि ब्राउज़र एक टुकड़ा भाग के साथ एक अनुरोध भी नहीं भेजेगा। ब्राउज़र में टुकड़ा भाग को वहीं हल किया जाता है। तो यह जावास्क्रिप्ट के माध्यम से उपलब्ध है।

वैसे भी, आप एक URL को बिट्स में विभाजित कर सकते हैं, जिसमें अंश भाग सहित, parse_url () का उपयोग कर सकते हैं , लेकिन यह स्पष्ट रूप से आपका मामला नहीं है।


98

सरल परीक्षण, http तक पहुँच : // localhost: 8000 / hello; foo = bar # यह-नहीं-भेजा गया सर्वर है

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>

PHP में parse_url () फ़ंक्शन काम कर सकता है अगर आपके पास पहले से ही आवश्यक URL स्ट्रिंग है जिसमें टुकड़ा ( http://codepad.org/BDqjtXix ) शामिल है:

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

Output: fizzbuzz

लेकिन मुझे नहीं लगता कि PHP के टुकड़े की जानकारी प्राप्त होती है क्योंकि यह केवल क्लाइंट है।


48

यह जावास्क्रिप्ट से पुनर्प्राप्ति योग्य है - जैसा कि window.location.hash। वहां से आप इसे उदाहरण के लिए अजाक्स के साथ सर्वर पर भेज सकते हैं, या इसे एनकोड कर सकते हैं और इसे URL में डाल सकते हैं जिसे तब सर्वर-साइड से गुजारा जा सकता है।


1
धन्यवाद! तो स्पष्ट होने के बजाय, इसके बजाय: www.example.com/?val=1#part2 आपको इसे सर्वर पर पुनर्निर्देशित करना होगा, इस तरह: www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2 और निश्चित रूप से आपको अपने दूसरे पृष्ठ में उस यूआरएल को पुनर्निर्देशित करने के लिए समर्थन में जोड़ना होगा। कमाल नहीं है, और बेशक सभी मामलों के उपयोग के लिए काम नहीं करता है, लेकिन बुकमार्क के लिए काम करता है। ध्यान दें कि यदि आप ऐसा करते हैं, तो आपको रीडायरेक्ट करने के लिए पूर्ण urls, केवल सापेक्ष url की अनुमति देनी चाहिए, यह सुनिश्चित करने के लिए कि आप अपने आप को असुरक्षित रीडायरेक्ट
ब्रैड पार्क

25

हैश को कभी भी सर्वर पर नहीं भेजा जाता है, इसलिए नहीं।


8

हां यह सच है, सर्वर को एंकर हिस्सा नहीं मिलता है। हालाँकि कुकीज़ का उपयोग करके एक वर्कअराउंड है। आप इसे यहां देख सकते हैं: http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/


2
यह "वर्कअराउंड" बेकार है। यदि आप प्रति पृष्ठ दृश्य 2 अनुरोधों के साथ ठीक हैं तो एक दर्जन बेहतर तकनीकें हैं।
umassthrower

11
यह कैसे बेकार है? यह निश्चित रूप से बेकार नहीं है। लेकिन वहाँ बेहतर तकनीक शायद ठीक है।
किशोर 12

बेहतर तकनीकें क्या हैं? मेरे Google oauth के लिए, मैंने इसे टोकन हैश की पहुँच के साथ अपने एपीआई पृष्ठ पर मुझे पुनः निर्देशित कर दिया है, फिर मैं "ajax inception" करता हूं जहां मैं एक त्वरित ajax स्क्रिप्ट प्रस्तुत करता हूं जो उसी पृष्ठ को ajaxes करता है, लेकिन hash मान के साथ इस बार अनुरोध पैरामीटर के रूप में । यह अजीब लगता है .. वहाँ शायद बेहतर तरीके हैं, लेकिन मैंने देखा है कि सभी तरीके
हैक

7

जवाब न है।

हैश का मुख्य उद्देश्य उस पृष्ठ के एक निश्चित भाग पर स्क्रॉल करना है जहाँ आपने बुकमार्क परिभाषित किया है। जैसे पेज लोड होने पर इस हिस्से पर स्क्रॉल करें।

ब्राउज़ इस तरह स्क्रॉल करेगा कि यह लाइन पृष्ठ की पहली दृश्यमान सामग्री है, जो इस बात पर निर्भर करती है कि लाइन के नीचे कितनी सामग्री है।

हाँ जावास्क्रिप्ट यह आरोप लगा सकता है, और फिर एक साधारण अजाक्स कॉल जादू करेगा


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

इसे और धाराप्रवाह बनाने के लिए:

सिर्फ जावास्क्रिप्ट और 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 के साथ प्राप्त नहीं कर सकते।

यद्यपि आप इसे जावास्क्रिप्ट के साथ php पर पुनर्निर्देशित कर सकते हैं।


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

यह काम होना चाहिए


यदि आपके पास स्ट्रिंग के रूप में यूआरएल है, भले ही आप इसे रेग एक्सप के साथ पार्स करें। समस्या यह है कि आप सर्वर से # photo45 का उपयोग नहीं कर सकते (phpinfo का उपयोग करें) और आप # photo45 को कहीं भी नहीं देखेंगे
Nik Chankov

1

एक की गु हिस्सा यूआरआई के बाद #/ क्लाइंट पक्ष पर कार्रवाई की है (देखें "टुकड़ा" कहा जाता है और है ही उपलब्ध परिभाषा से है 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="">

जावास्क्रिप्ट / jQuery का उपयोग करके आप इस क्षेत्र का मान पेज लोड या किसी ईवेंट का जवाब दे सकते हैं:

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

सर्वर की ओर php में आप $ _POST संग्रह का उपयोग करके इस मान को पढ़ सकते हैं:

$server_location_hash = $_POST['myHiddenLocationHash'];

0

हम इसे दूसरे दृष्टिकोण से भी कर सकते हैं, जैसे सबसे पहले js से हैश वैल्यू प्राप्त करें और उस पैरामीटर का उपयोग करके ajax को कॉल करें और हम जो चाहें कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.