منذ بعض الوقت ، كنت بحاجة إلى الحصول على مصدر الصفحة من خلال JavaScript. هذه العملية بسيطة للغاية. يمكنك الحصول عليها باستخدام document.referrer. ومع ذلك ، لا يزال هناك العديد من المواقف غير المتوقعة في التطبيقات الفعلية ، لذلك دعونا نفرزها بإيجاز هنا.
المشكلة الأولى التي واجهتها هي أنه بعد الانتقال من صفحة HTTPS إلى صفحة HTTP ، تكون قيمة المستند. REFERRER فارغة. لأسباب أمنية ، تستخدم بعض الصفحات المهمة في العديد من مواقع الويب (مثل صفحة تسجيل الدخول إلى Taobao) بروتوكول HTTPS. إذا كان المستخدم الذي لم يتم تسجيل الدخول إلى نقرات على الرابط إلى الصفحة B (صفحة http) في الصفحة A (صفحة http) ، ولكن الصفحة B تتطلب من المستخدم تسجيل الدخول ، لذلك يقفز إلى صفحة تسجيل الدخول (صفحة https) ، ثم يقفز مرة أخرى إلى B (http page) بعد تسجيل الدخول ، ستجد هذا الوثيقة. لا يمكن أن تكون محددة على الصفحة. المرجع ، إذا كانت هناك صفحة HTTP وصفحة HTTPS في المسار ، فسيتم كسر المسار من HTTPS إلى HTTP.
إن جذر هذه المشكلة هو سياسة أمن المستعرض ، ويبدو أنه لا يوجد حل جيد بشكل خاص للاعتماد على JavaScript وحده. تتمثل فكرة RoundAbout في استخدام Window.name ، واكتب عنوان URL الخاص بالصفحة الحالية في Window.name على صفحة HTTPS ، ثم اقرأه في الصفحة التالية (صفحة HTTP).
بالإضافة إلى هذا الموقف ، هل يمكن استرداد المستند. لقد بحثت ووجدت أن شخصًا ما قام بتجميع قائمة هنا ، لكنها غير كاملة ، مثل حالة IE6 غير المدرجة. لذلك فعلت ذلك بنفسي ، وتثبيت متصفحات N في الجهاز الظاهري ، واختبرت جميع المواقف (كانت حقًا وظيفة مادية) ، وتم عرض النتائج في الجدول أدناه:
| تعمل | IE6 | IE7 | IE8 | IE9 | Firefox | الكروم | الأوبرا | سفاري |
|---|---|---|---|---|---|---|---|---|
| أدخل عنوان URL مباشرة في شريط العناوين | "" " | "" " | "" " | "" " | "" " | "" " | "" " | "" " |
| الوصول إلى عنوان URL من المرجعية | "" " | "" " | "" " | "" " | "" " | "" " | "" " | "" " |
| انقر فوق الارتباط التشعبي من الصفحة A وقفز إلى الصفحة B (Target = "_ Self") | √ | √ | √ | √ | √ | √ | √ | √ |
| انقر على الارتباط التشعبي من الصفحة A وقفز إلى الصفحة B (Target = "_ فارغ") | √ | √ | √ | √ | √ | √ | √ | √ |
| انقر بزر الماوس الأيمن فوق الارتباط التشعبي من الصفحة A وفتح الصفحة B في علامة تبويب جديدة | - | √ | √ | √ | √ | √ | √ | "" " |
| انقر بزر الماوس الأيمن فوق الارتباط التشعبي من الصفحة A وفتح الصفحة B في نافذة جديدة | √ | √ | √ | √ | √ | √ | √ | "" " |
| اسحب الرابط إلى شريط العناوين | "" " | غير قادر على السحب | غير قادر على السحب | "" " | "" " | "" " | "" " | "" " |
| اسحب الرابط إلى شريط علامة التبويب | - | "" " | "" " | "" " | "" " | "" " | "" " | "" " |
| استخدم أزرار المستعرض للأمام والخلفي | √ | √ | √ | √ | √ | √ | √ | √ |
| JS تعديل الموقع. href | "" " | "" " | "" " | √ | √ | √ | √ | √ |
| يستخدم JS Window.Open | "" " | "" " | "" " | "" " | √ | √ | √ | √ |
| إعادة توجيه الخادم (302 قفزة) | استهداف الصفحة السابقة | استهداف الصفحة السابقة | استهداف الصفحة السابقة | استهداف الصفحة السابقة | استهداف الصفحة السابقة | استهداف الصفحة السابقة | استهداف الصفحة السابقة | استهداف الصفحة السابقة |
| تحديث صفحة التعريف | "" " | "" " | "" " | "" " | "" " | تحول الصفحة | تحول الصفحة | تحول الصفحة |
يعني "√" في الجدول أعلاه أنه يمكن استرداد المرجع بشكل طبيعي ، "" يعني أن المرجع فارغ.
باستثناء IE ، فإن المتصفحات الأخرى هي أحدث الإصدارات التي يمكن تنزيلها على الموقع الرسمي. من بينها ، اختبر Safari كل من إصدار Windows وإصدار Mac ، والاستنتاج هو نفسه.
هناك أيضًا بعض الحالات التي لم يتم فيها إجراء أي اختبارات ، مثل ما إذا كان يمكن الحفاظ على المرجع تحت كل متصفح عند النقر فوق فلاش للقفز.
تتماشى معظم المواقف في الجدول أعلاه مع التوقعات ، ولكن يبدو أن هناك عدة أشياء يجب الانتباه إليها:
1. في رحلات السفاري ، فإن النقر بزر الماوس الأيمن لفتح الرابط سيؤدي إلى فقدان المرجع ؛
2. في IE ، SOTIOND MOTITION.HREF أو استخدام Window.Open لفتح الصفحة سيفقد المرجع (هناك استثناء في IE 9 ، باستخدام location.href للقفز لن يفقد المرجع) ؛
3. عند استخدام Meta Jump ، سيتم فقد المرجع تحت IE/Firefox.
أخيرًا ، هناك استنتاج بسيط هو: إذا كنت بحاجة إلى الوصول إلى المصدر من خلال صفحة مجموعة REFRERRER ، فمن الأفضل عدم استخدام JS للقفز أو فتح نافذة جديدة ، ولا استخدام META للقفز.