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-адресов в .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 для: записи в журнале доступа: 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