Apache mod_rewrite mã hóa chuỗi truy vấn kép khi chuyển hướng


13

Chúng tôi đã gặp phải một vấn đề lạ (có lẽ là lỗi?) Với hành vi của mod_rewrite của Apache khi chuyển qua các chuỗi truy vấn.

Để tái tạo, chúng tôi đã thiết lập cài đặt Ubuntu (một chiều) sạch với cấu hình Apache mặc định. Chúng tôi đã kích hoạt mod_rewrite và trong cấu hình trang mặc định, chúng tôi đã thêm vào như sau:

RewriteEngine on
RewriteRule ^/(.*)$ /r/$1 [R]

Để kiểm tra, chúng tôi sử dụng curl:

curl -I 'http://[ubuntu-machine]/a/b%20c?a%20b'

Đầu ra có liên quan là:

HTTP/1.1 302 Found
Server: Apache/2.2.20 (Ubuntu)
Location: http://[ubuntu-machine]/r/a/b%20c?a%2520b

Như bạn có thể thấy, chuỗi truy vấn được thoát kép, đó là sai. Có ai có bất cứ ý tưởng làm thế nào chúng ta có thể khắc phục điều này? Một vài điều chúng tôi đã thử:

  • Thêm [NE]. Điều này cung cấp cho chúng ta chuỗi truy vấn chính xác, nhưng đường dẫn không được giải quyết, dẫn đến các vấn đề mới.
  • Thêm [NE, B]. Điều này dường như hoạt động, nhưng làm cho /giữa abcác phần của con đường được thoát ra.
  • Unscaping chuỗi truy vấn bằng tay.

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

    Tuy nhiên, điều này có nghĩa là chúng ta không thể phân biệt giữa, giả sử &và một thoát &trong chuỗi truy vấn.

Cập nhật:

Báo cáo lỗi này mô tả cùng một vấn đề. Nhận xét đầu tiên liên kết đến một cam kết rõ ràng đang khắc phục vấn đề, nhưng như Pieter nói dưới đây, có vẻ như nó không thực sự được sửa chữa.

Câu trả lời:


7

Đây dường như là một lỗi trong Apache. Báo cáo lỗi này hơi lộn xộn, nhưng mô tả chính xác vấn đề của bạn:

https://issues.apache.org/ormszilla/show_orms.cgi?id=34602

Có vẻ như họ nhận thức được vấn đề. Mặc dù lỗi đã tuyên bố rằng họ đã sửa, tôi đã thử nghiệm điều này với Apache 2.3.15 và vấn đề dường như vẫn còn đó. Cũng lưu ý rằng Apache 2.3 là phiên bản beta, do đó, nó không có tác dụng với bạn ngay cả khi nó đã sửa nó, cho đến khi Apache 2.4 không hoạt động.


Có vẻ như Apache 2.4.10 vẫn đang làm điều này, mặc dù nó đã được sửa trong 2.4.1 .
Arjan

1
Tôi vẫn thấy vấn đề trong 2.4.7
François
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.