2015-02-13 2 views
4

установки

мы имеем следующую структуру каталогов на нашем HTTP/веб-сервер:Разрешить вопросительные знаки без запроса "?" в URL/URI без кодирования

/questions/who?/ 
/questions/what?/ 
/happy? part. 01/ 
/happy? yet?/ 
/happy? yet? again? really?!/ 

вопрос

мой вопрос: можно ли иметь соответствующий URI/URL с unescaped/unencoded вопросительные знаки (?) разрешены правильно? например URL http://test.org/happy? part. 01/ будет разрешен к /happy? part. 01/ на сервере. из-за ?, означающего строку запроса, это было проблемой для меня.

фон/исследование

, как ожидается, по умолчанию Apache обрабатывает первый ? как начало строки запроса. поэтому из коробки URL-адрес http://test.org/happy? part. 01/ будет преобразован в путь URI /happy и строку запроса part.01/, в результате получится 404, так как путь /happy не существует.

большинство других ответов/советов я нашел в своем исследовании, в основном иметь дело с переписывания URL в предположении, что ? указывает строку запроса, например,

однако, в этом случае мы можем предположить, что наш HTTP-сервер не будет получать URL-адреса со строками запроса.

Я понимаю, что обычно браузеры/etc. будет кодировать URI перед отправкой на сервер (например, http://test.org/happy? part. 01/ будет отправлен на сервер как http://test.org/happy%3F%20part.%2001/, хотя символы кодируются depends on the app и их поддержка, для которой стандартная версия URI: RFC2396 или RFC3986). но для этого сценария сервер может получать URL-адреса без привязки, но никогда никаких URL-адресов с строками запросов.

мои попытки

сначала я думал, что простое правило, как это было бы достаточно:

RewriteRule ([^\?]*?)\?([^\?]*?) $1\?$2 [NE,N] 

здесь я пытаюсь повторно найти все ? с и просто вставьте их в URL неэкранированное. к сожалению, регулярное выражение (и многие варианты) не соответствует URL-адресам, которые содержат ?, вместо этого соответствует только закодированному значению ?%3F. и даже когда он совпадает, вторая группа захвата $2 кажется всегда пустой. наконец, \? в строке замены, кажется, предотвращает что-либо после того, как он был записан.

приведенные выше ссылки привели меня к тому, что для проверки ? мне пришлось проверить переменную %{THE_REQUEST}, так как Apache разделит строку запроса на другие переменные сервера/RewriteRules.С этой целью я попытался вариации этого:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ \/([^\?]*?)\?([^\?]*?)\/?\ HTTP 
RewriteRule ^(.*?)\?(.*?)$ $1\?$2 [NE,N] 

в то время как регулярное выражение RewriteCond является соответствие URIs с ?, то %2 в RewriteRule вызывает Internal Server Error, хотя и без него я, кажется, не имеют возможности получения доступа к часть URL-адреса после ?.

, наконец, я также пробовал различные вещи с %{QUERY_STRING} и [QSA], но все равно не повезло.

спасибо, что посмотрели.

ответ

2

Как насчет просто:

RewriteCond %{ENV:REDIRECT_STATUS} !200 
RewriteCond %{QUERY_STRING} !^$ 
RewriteRule ^(.*)$ /$1\%3F%{QUERY_STRING} [L,NE] 

EDIT:

Попробуйте это:

RewriteCond %{QUERY_STRING} ^(.*)\?(.*)$ 
RewriteRule ^(.*)$ /$1?%1\%3F%2 [L] 

RewriteCond %{QUERY_STRING} !^$ 
RewriteRule ^(.*)$ /$1\%3F%{QUERY_STRING}? [L,NE] 
+0

спасибо! это работает для случаев, когда имеется только один символ '?', хотя с несколькими зарезервированными символами (в данном случае '?') в URL-адресе он отбрасывает все после второго '?', включая второй '?': ' http://test.org/happy? еще?/'возвращает' Запрошенный URL/счастливый? еще не был найден также, когда завершающий символ '/' остался без перезаписи: 'http://test.org/happy? часть. 01/'становится' http://test.org/happy%3f part. 01 /? часть. 01', и сервер возвращает 'Запрошенный URL/happy не был найден'. 1-я проблема кажется более сложной, вторая, возможно, просто небольшая смена, хотя все еще вне меня. – waynedpj

+0

@waynedpj see редактировать –

+0

@waynedpj [это работает для меня] (http://i.stack.imgur.com/1Exz5.png) –

Смежные вопросы