هل يمكنني قراءة جزء التجزئة من عنوان URL على تطبيق My Server-Side (PHP، Ruby، Python، إلخ)؟
-
06-09-2019 - |
سؤال
على افتراض عنوان URL من:
www.example.com/?val=1#part2
PHP يمكن قراءة متغيرات الطلب val1
باستخدام مجموعة الحصول على صفيف.
هي قيمة التجزئة part2
مقروءة أيضا؟ أو هل هذا فقط حتى المتصفح وجافا سكريبت؟
المحلول
المشكلة الرئيسية هي أن المتصفح لن يرسل طلبا مع جزء شظية. تم حل جزء الشظية هناك في المتصفح. لذلك يمكن الوصول إليها من خلال جافا سكريبت.
على أي حال، يمكنك تحليل عنوان URL في البتات، بما في ذلك الجزء الشظية، باستخدام parse_url (), ، ولكن من الواضح أنه ليس حالتك.
نصائح أخرى
اختبار بسيط، والوصول 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 عبر JavaScript باستخدام، كمثال:
<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 يتلقى معلومات الشظية لأنه عميل فقط.
يتم استرجاعها من جافا سكريبت - كما window.location.hash
. وبعد من هناك، يمكنك إرسالها إلى الخادم باستخدام AJAX على سبيل المثال، أو ترميزه ووضعه في عناوين URL التي يمكن بعد ذلك تمريرها إلى جانب الخادم.
لا يتم إرسال التجزئة أبدا إلى الخادم، لذلك لا.
نعم هذا صحيح، لا يحصل الخادم على جزء المرساة. ومع ذلك، هناك حل باستخدام ملفات تعريف الارتباط. يمكنك العثور عليها هنا: http://www.stoimen.com/blog/2009/04/15/read-the-thehor-part-of-the-url-with-php/
الجواب لا.
الغرض الرئيسي من التجزئة هو التمرير إلى جزء معين من الصفحة التي حددتها إشارة مرجعية. على سبيل المثال، قم بالتمرير إلى هذا الجزء عند تحميل الصفحة.
ستقوم الاستعراض بالتمرير بحيث يكون هذا السطر هو أول محتوى مرئي في الصفحة، اعتمادا على مقدار المحتوى التالي أدناه الخط.
نعم جافا سكريبت يمكن أن يؤكد ذلك، ثم دعوة AJAX البسيطة ستقوم بالسحر
أعتقد أن قيمة التجزئة تستخدم فقط جانب العميل فقط، لذلك لا يمكنك الحصول عليها مع PHP.
يمكنك إعادة توجيهها مع جافا سكريبت إلى PHP رغم ذلك.
نعم يمكنك:
استخدم هذه الطريقة لمنع الأخطاء:
<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
ماذا عن:
الاستيلاء بشكل حيوي على #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')">Change to #hash1</a><br/>
<a onclick="changehash(this,'#hash2')">Change to #hash2</a>
<?php echo "This is the current hash: " . $hash; ?>
<?php
$url=parse_url("http://domain.com/site/gallery/1?user=12#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
?>
هذا يجب أن تعمل
عشر جزء من أوري بعد #
يسمى "شظية" وهو بحكم تعريفه متاح فقط / معالجته على جانب العميل (انظر https://en.wikipedia.org/wiki/fragment_dentifier.).
على جانب العميل، يمكن الوصول إلى هذا باستخدام JavaScript مع window.location.hash
.
حل آخر هو إضافة حقل إدخال مخفي إلى صفحة PHP:
<input type="hidden" id="myHiddenLocationHash" name="myHiddenLocationHash" value="">
باستخدام JavaScript / JQuery، يمكنك ضبط قيمة هذا الحقل على تحميل الصفحة أو الاستجابة لحدث:
$('#myHiddenLocationHash').val(document.location.hash.replace('#',''));
في PHP على جانب الخادم، يمكنك قراءة هذه القيمة باستخدام مجموعة $ _Post:
$server_location_hash = $_POST['myHiddenLocationHash'];
يمكننا أن نفعل ذلك بنهج آخر أيضا، مثل أولا وقبل كل شيء الحصول على قيمة التجزئة من JS واتصل AJAX باستخدام هذه المعلمة ويمكن أن تفعل ما نريده