Първо замяна на PHP? в низ за заявка със символ &

(LAMP стека работи на CentOS 6, PHP 5.3.3, httpd версия 2.2.15)

Опитвам се да предам целия низ на заявката към моя PHP скрипт, но ако низът на заявката съдържа знаци с въпросителен знак, първият ? символът се заменя със знак &.

В access_log се показва правилният низ за заявка, включително въпросителния знак.

Ако обаче повторя глобалния $_SERVER['QUERY_STRING'], първият ? се заменя. Така че предполагам, че преводът/нормализацията се извършва някъде в PHP.

Например: http://l.sitename.com/IsThis?thequerystring?

Очакваме $_SERVER['QUERY_STRING'] да бъде "IsThis?thequerystring?" Но вместо това всъщност е "IsThis&thequerystring?"

Ето записа в access_log:

"GET /IsThis?thequerystring? HTTP/1.1" 200 43 "-"

Ето записа .htaccess:

RewriteCond %{HTTP_HOST} ^l\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/link.php?$1    [NC,L,P,QSA]

Най-странното нещо: работеше, но сега не работи след инсталиране на актуализации (CentOS, HTTPD, PHP и т.н.).

Благодаря за всякакви насоки!


person Ryan Griggs    schedule 16.05.2015    source източник
comment
Защо /IsThis?thequerystring? като пример дори би бил това, което смятате за валиден URI? Трябва да има само един ? в URI, който не е URL кодиран.   -  person Mike Brant    schedule 18.05.2015
comment
@mike искам хората да могат ръчно да подават пълни URL адреси към тази страница. Например http://l.example.com/http://www.google.com?query=whatismyname?&otherparam=asdf   -  person Ryan Griggs    schedule 19.05.2015
comment
Тогава тези URL адреси трябва да бъдат URL кодирани. Ако направите това, проблемът ви изчезва и можете да използвате правилно SQA флага, както би трябвало да можете да направите, ако искате да добавите свои собствени параметри към случаите, когато някои параметри вече са предадени преди пренаписване.   -  person Mike Brant    schedule 19.05.2015
comment
Как бихте URL-кодирали ръчно въведен url? Искам потребителят да въведе url адреса в адресната лента, без да е необходимо да попълва формуляр. Можете ли да правите url кодиране в .htaccess на ръчно въведени url адреси? Обърнете внимание отново, че те ще въвеждат/поставят URL адреса директно в адресната лента, без предварителна обработка върху него и ние трябва да уловим всичко, което хвърлят към него. Благодаря.   -  person Ryan Griggs    schedule 19.05.2015
comment
ДОБРЕ. Това е странен случай на употреба, обикновено когато говорим за предаване на параметри, не очаквате някой да ги въвежда ръчно в адресната лента.   -  person Mike Brant    schedule 19.05.2015


Отговори (1)


Премахнете флага QSA, в противен случай ? се преобразува в ?:

RewriteCond %{QUERY_STRING} ^$
RewriteCond %{HTTP_HOST} ^l\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/user.php?$1 [L,P]

RewriteCond %{QUERY_STRING} .+
RewriteCond %{HTTP_HOST} ^l\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/user.php?$1?%{QUERY_STRING} [L,P]

С това ще получите:

$_SERVER["QUERY_STRING"] = IsThis?thequerystring?
person anubhava    schedule 16.05.2015
comment
Това почти работи. Той обаче добавя въпросителния знак в края, дори ако няма низ за заявка. Например l.sitename.com/ThisHasNoQuestion - $_SERVER[QUERY_STRING] = ThisHasNoQuestion?. Как мога да пропусна въпросителния знак, ако низът на заявката е празен? - person Ryan Griggs; 17.05.2015
comment
Съжалявам, че досаждам, но това не проработи според очакванията. Примерен URL адрес: l.example.com/asdf?1234 Резултат: 502 Прокси грешка Прокси сървърът получи невалиден отговор от сървър нагоре по веригата. Прокси сървърът не можа да обработи заявката GET /asdf. Причина: Неуспешно търсене в DNS за: access_log запис: GET /asdf?1234 HTTP/1.1 502 379 По някакъв начин частта link.php се пропуска изцяло. Същото нещо се случва, ако пропусна въпросителния знак и просто използвам: l.example.com/asdf Благодаря! - person Ryan Griggs; 17.05.2015
comment
Съжаляваме, но не показа никакви прекъсвания на редове. access_log трябва да е на нов ред. - person Ryan Griggs; 17.05.2015
comment
Ура! Работи! Не знаех, че редът на редовете на RewriteCond има значение. Защо тази конкретна поръчка има някакво значение? - person Ryan Griggs; 18.05.2015
comment
Всъщност не съм напълно сигурен, но предполагам, че уловените групи от RewriteCond работят само от най-близките условия от RewriteRule. - person anubhava; 18.05.2015