Sudah diketahui dengan baik bahwa fragmen URL (bagian setelah #
) tidak dikirim ke server.
Saya bertanya-tanya bagaimana fragmen bekerja ketika pengalihan server (melalui status HTTP 302 dan Location:
header) terlibat.
Pertanyaan saya sebenarnya dua kali lipat:
Jika URL asli memiliki fragmen (
/original.php#foo
), dan pengalihan dibuat ke/new.php
, apakah bagian fragmen dari URL asli hilang begitu saja? Atau apakah terkadang diterapkan ke URL baru?
Apakah URL baru akan pernah ada/new.php#foo
dalam kasus ini?Terlepas dari URL aslinya, jika server mengalihkan ke URL baru dengan fragment (
/new.php#foo
), akankah fragmen tersebut "dihormati"? Atau apakah server benar-benar tidak memiliki bisnis yang mengganggu fragmen sama sekali - dan akankah browser mengabaikannya hanya dengan membuka/new.php
??
Jawaban:
Pembaruan 2014-Jun-27 :
RFC 7231, Hypertext Transfer Protocol (HTTP / 1.1): Semantik dan Konten , telah diterbitkan sebagai STANDAR YANG DIUSULKAN. Dari Changelog :
Poin-poin penting dari Bagian 7.1.2. Lokasi :
Ini harus menjawab pertanyaan Anda dengan jelas.
Perbarui END
ini adalah masalah terbuka (tidak ditentukan) dengan spesifikasi HTTP saat ini . hal ini dibahas dalam 2 masalah kelompok kerja httpbis IETF :
# 6 memungkinkan fragmen di
Location
header. # 43 mengatakan ini:ini mengarah ke browser yang paling kompatibel dan bukti masa depan (karena masalah ini pada akhirnya akan menjadi standar) jawaban untuk pertanyaan Anda:
J: fragmen dari URL asli dibuang.
B: fragmen dari
Location
header dihormati.sumber
Safari 5 dan IE9 dan di bawahnya melepaskan fragmen URI asli jika pengalihan HTTP / 3xx terjadi. Jika header Lokasi pada respons menentukan fragmen, itu akan digunakan.
IE10 +, Chrome 11+, Firefox 4+, dan Opera semua akan "memasang kembali" fragmen URI asli setelah mengikuti pengalihan 3xx.
Halaman pengujian: http://www.webdbg.com/test/redir/fragment/ .
Lihat diskusi lebih lanjut tentang masalah ini di http://blogs.msdn.com/b/ieinternals/archive/2011/05/17/url-fragments-and-redirects-anchor-hash-missing.aspx
sumber
Location
berisi fragmen, itu akan menyimpannya dengan benar. Namun jika pengalihanLocation
dengan fragmen melewati pengalihan 3xx lainnya, secara misterius ia akan mengabaikan fragmen dari pengalihan pertama, yang tidak konsisten dengan 2 perilaku sebelumnya. Chrome dan Firefox secara konsisten melestarikannya.Sekadar memberi tahu Anda, di sini Anda dapat menemukan spesifikasi yang tepat. dengan w3c mendefinisikan bagaimana semua harus berperilaku: http://www.w3.org/TR/cuap#uri - klausul 4.1 - lihat di bawah:
sumber
Posting masalah serupa dengan solusi yang saya hadapi.
Semoga dapat membantu seseorang dengan persyaratan serupa
preserving hash in IE
untuk 302 pengalihan.Menambahkan bagian penting dari jawaban alih-alih tautan saja
Kami menggunakan
SiteMinder
otentikasi dalam aplikasi kami.Saya menemukan bahwa setelah otentikasi berhasil,
SiteMinder
lakukan302 redirection
ke halaman aplikasi yang diminta pengguna dengan menggunakan variabel tersembunyi formulir loginvalue
(di mana ia menyimpan URL yang diminta pengguna/myapp/
-without hash fragment
karena tidak akan dikirim ke server) dengan nama yang mirip denganredirect
. Contoh formulir di bawah iniKarena nilai
redirect
variabel tersembunyi hanya berisi tanpa fragmen hash dan ini adalah pengalihan 302, fragmen hash secara otomatis dihapus oleh IE bahkan sebelum masuk ke aplikasi kami dan solusi apa pun yang kami coba dalam kode aplikasi kami tidak berhasil./myapp/
IE hanya mengalihkan
/myapp/
dan mendarat di halaman beranda default aplikasi kamihttps://ourapp.com/myapp/#/home
.Telah menyia-nyiakan waktu hampir sehari untuk mencari tahu perilaku ini.
Solusinya adalah:
Telah mengubah form login variabel tersembunyi (
redirect
) nilai untuk memegang fragmen hash dengan menambahkanwindow.location.hash
bersama dengan nilai yang ada. Mirip dengan kode di bawah ini$(function () { var $redirect = $('input[name="redirect"]'); $redirect.val($redirect.val() + window.location.hash); });
Setelah perubahan ini,
redirect
variabel tersembunyi menyimpan nilai URL yang diminta pengguna sebagai/myapp/#/pending/requests
danSiteMinder
mengarahkannya ke/myapp/#/pending/requests
IE.Solusi di atas berfungsi dengan baik di ketiga browser
Chrome, Firefox and IE
.Terima kasih kepada @AlexFord untuk penjelasan mendetail dan memberikan solusi untuk masalah ini.
sumber