Apache mod_rewrite는 리디렉션시 쿼리 문자열을 이중으로 인코딩합니다.


13

쿼리 문자열을 통과 할 때 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] 추가. 이것은 작동하는 것처럼 보이지만 경로의 부분 과 부분 /사이 를 탈출합니다.ab
  • 쿼리 문자열을 수동으로 이스케이프 처리

    RewriteCond %{QUERY_STRING} .*
    RewriteMap unescape int:unescape  
    RewriteRule ^(.*)$          $1?${unescape:%{QUERY_STRING}}
    

    그러나 이것은 쿼리 문자열에서 an &과 escape &를 구별 할 수 없다는 것을 의미 합니다.

최신 정보:

이 버그 보고서 는 같은 문제를 설명합니다. 첫 번째 주석은 분명히 문제를 해결하는 커밋에 연결되지만 Pieter가 아래에서 말한 것처럼 실제로 수정 된 것처럼 보이지 않습니다.

답변:


7

이것은 Apache의 버그 인 것 같습니다. 이 버그 보고서는 약간 지저분하지만 문제를 정확하게 설명합니다.

https://issues.apache.org/bugzilla/show_bug.cgi?id=34602

그들이 문제를 알고있는 것 같습니다. 버그가 수정되었다고 주장하지만 Apache 2.3.15로 이것을 테스트했지만 여전히 문제가있는 것 같습니다. 또한 Apache 2.3은 베타 버전이므로 Apache 2.4가 출시 될 때까지 수정 한 경우에도 아무 소용이 없습니다.


Apache 2.4.10이 2.4.1 에서 수정 되었지만 여전히이 작업을 수행하는 것 같습니다 .
Arjan

1
여전히 2.4.7에서 문제가 발생합니다
François
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.