Czy można mieć więcej niż jeden znak zapytania w adresie URL?

92

Dzisiaj trafiłem na następujący adres URL:

http://www.sfgate.com/cgi-bin/blogs/inmarin/detail??blogid=122&entry_id=64497

Zwróć uwagę na podwójny znak zapytania na początku ciągu zapytania:

??blogid=122&entry_id=64497

Wydawało się, że moja przeglądarka nie ma z tym żadnych problemów i uruchomiła szybką zakładkę:

javascript:alert(document.location.search);

właśnie podał mi ciąg zapytania pokazany powyżej.

Czy to jest prawidłowy adres URL? Powodem, dla którego jestem tak pedantyczny (zakładając, że jestem), jest to, że muszę analizować takie adresy URL pod kątem parametrów zapytania, a obsługa podwójnych znaków zapytania wymagałaby pewnych zmian w moim kodzie. Oczywiście, jeśli są na wolności, będę musiał ich wspierać; Jestem głównie ciekawy, czy to moja wina, że ​​nie przestrzegam dokładnie standardów adresów URL, czy w rzeczywistości jest to niestandardowy adres URL.

Klecić
źródło
Na szczęście mimo to nie musiałem zmieniać kodu. Używałem indexOf()do zlokalizowania znaku zapytania, więc podniosło pozycję pierwszego wystąpienia. Następnie dzielę parametry query_parameters na każdym, &a następnie ich pary nazwa / wartość na każdym =.
Bungle

Odpowiedzi:

108

Tak, to jest ważne. Tylko pierwszy ? adres w adresie URL ma znaczenie, wszystkie po nim są traktowane jako dosłowne znaki zapytania:

Składnik zapytania jest oznaczony pierwszym znakiem zapytania („?”) I zakończony znakiem numeru („#”) lub końcem identyfikatora URI.

...

Znaki ukośnika („/”) i znak zapytania („?”) Mogą reprezentować dane w składniku zapytania. Należy pamiętać, że niektóre starsze, błędne implementacje mogą nie obsługiwać takich danych poprawnie, gdy są one używane jako podstawowy identyfikator URI dla odniesień względnych (sekcja 5.1), najwyraźniej dlatego, że nie potrafią odróżnić danych zapytania od danych ścieżek podczas wyszukiwania separatorów hierarchicznych. Ponieważ jednak komponenty zapytania są często używane do przenoszenia informacji identyfikujących w postaci par „klucz = wartość”, a jedna często używana wartość jest odniesieniem do innego identyfikatora URI, czasami lepiej jest uniknąć kodowania procentowego tych znaków.

http://tools.ietf.org/html/rfc3986#section-3.4

Bursztyn
źródło
9
Czy to oznacza, że ​​pierwszy parametr zapytania nosi nazwę „? Blogid”, a nie „blogid”? To mogłoby być zabawne ...
GalacticCowboy
3
@GalacticCowboy - Tak, to samo właśnie przyszło mi do głowy. Masz rację - Firebug potwierdza, że ​​pierwszy parametr zapytania jest faktycznie ?blogid. Wydaje się, że jest to nieistotny parametr, tj. Strona jest obsługiwana tak samo z dowolną liczbą znaków zapytania lub całkowicie pomijana.
Bungle
27

Jako odpowiedź powiązaną stycznie foo?spam=1?&eggs=3podaje parametrowi spamwartość1?

Hilton Shumway
źródło
tak. w przypadku braku .htaccesslub podobnych sztuczek. jeśli zmienimy foona script.phpi wyślemy tę prośbę, script.php?spam=1?&eggs=3wtedy var_dump($_GET)pokaże sięarray(2) { ["spam"]=> string(2) "1?" ["eggs"]=> string(1) "3" }
Hebe