쿼리 문자열을 통과 할 때 Apache mod_rewrite의 동작에 이상한 문제 (버그일까요?)가 발생했습니다.
재현하기 위해 기본 Apache 구성으로 깨끗한 Ubuntu (oneiric) 설치를 설정했습니다. mod_rewrite를 활성화했으며 기본 사이트 구성에서 다음을 추가했습니다.
RewriteEngine on
RewriteRule ^/(.*)$ /r/$1 [R]
테스트하기 위해 curl을 사용합니다.
curl -I 'http://[ubuntu-machine]/a/b%20c?a%20b'
관련 출력은 다음과 같습니다.
HTTP/1.1 302 Found
Server: Apache/2.2.20 (Ubuntu)
Location: http://[ubuntu-machine]/r/a/b%20c?a%2520b
보시다시피 쿼리 문자열이 이중 이스케이프 처리되어 잘못되었습니다. 누구든지 우리가 이것을 고칠 수있는 방법을 알고 있습니까? 우리가 시도한 몇 가지 :
- [NE] 추가. 이것은 올바른 쿼리 문자열을 제공하지만 경로가 이스케이프 처리되지 않아 새로운 문제가 발생합니다.
- [NE, B] 추가. 이것은 작동하는 것처럼 보이지만 경로의 부분 과 부분
/
사이 를 탈출합니다.a
b
-
쿼리 문자열을 수동으로 이스케이프 처리
RewriteCond %{QUERY_STRING} .* RewriteMap unescape int:unescape RewriteRule ^(.*)$ $1?${unescape:%{QUERY_STRING}}
그러나 이것은 쿼리 문자열에서 an
&
과 escape&
를 구별 할 수 없다는 것을 의미 합니다.
최신 정보:
이 버그 보고서 는 같은 문제를 설명합니다. 첫 번째 주석은 분명히 문제를 해결하는 커밋에 연결되지만 Pieter가 아래에서 말한 것처럼 실제로 수정 된 것처럼 보이지 않습니다.
답변
이것은 Apache의 버그 인 것 같습니다. 이 버그 보고서는 약간 지저분하지만 문제를 정확하게 설명합니다.
https://issues.apache.org/bugzilla/show_bug.cgi?id=34602
그들이 문제를 알고있는 것 같습니다. 버그가 수정되었다고 주장하지만 Apache 2.3.15로 이것을 테스트했지만 여전히 문제가있는 것 같습니다. 또한 Apache 2.3은 베타 버전이므로 Apache 2.4가 출시 될 때까지 수정 한 경우에도 아무 소용이 없습니다.