установки
мы имеем следующую структуру каталогов на нашем 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 в предположении, что ?
указывает строку запроса, например,
- .htaccess Question mark allowing
- Apache .htaccess: How to remove question mark from URL if not `?id=(.*)`?
- htaccess rewrite rule, remove question mark
однако, в этом случае мы можем предположить, что наш 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]
, но все равно не повезло.
спасибо, что посмотрели.
спасибо! это работает для случаев, когда имеется только один символ '?', хотя с несколькими зарезервированными символами (в данном случае '?') в URL-адресе он отбрасывает все после второго '?', включая второй '?': ' http://test.org/happy? еще?/'возвращает' Запрошенный URL/счастливый? еще не был найден также, когда завершающий символ '/' остался без перезаписи: 'http://test.org/happy? часть. 01/'становится' http://test.org/happy%3f part. 01 /? часть. 01', и сервер возвращает 'Запрошенный URL/happy не был найден'. 1-я проблема кажется более сложной, вторая, возможно, просто небольшая смена, хотя все еще вне меня. – waynedpj
@waynedpj see редактировать –
@waynedpj [это работает для меня] (http://i.stack.imgur.com/1Exz5.png) –