2010-08-23 33 views
5

Tôi có một url có chứa những điều sau đây:Apache:% 25 trong url (400 Bad Request)

/somepath/morestuff/ohno%25foobar 

Đối với một số lý do apache được báo cáo theo yêu cầu xấu 400 (nó có cái gì để làm với% 25) . Tôi đang sử dụng mod_rewrite để viết lại đường dẫn để trỏ đến trường hợp codeigniter của tôi nhưng nó thậm chí không nhận được để codeigniter, nó chỉ là lỗi apache mặc định.

Bất kỳ ý tưởng nào?

+0

Có lý do nào bạn cần '% 25' không? '% 25' là mã cho một dấu'% '. – Powerlord

+0

@ Bemrose, nó thực sự là một api nơi mọi người có thể đăng bất kỳ chuỗi nào. –

Trả lời

11

Tôi nghi ngờ bạn đang sử dụng PATH_INFO để xử lý yêu cầu CodeIgniter của bạn. Do đó, tập tin .htaccess của bạn có chứa một bộ quy tắc đó trông tương tự như sau:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^.*$ index.php/$0 [L] 

Khi mod_rewrite kiểm tra URL của mình, họ đã được giải mã sang định dạng nhân vật tự nhiên của họ, vì vậy trong trường hợp này %25 đã trở thành chỉ %. Khi bạn áp dụng quy tắc này, backreference thực sự chứa văn bản theo ngữ nghĩa somepath/morestuff/ohno%foobar, được mặc định là không được mã hóa lại. Apache không có ý tưởng rằng những gì mà % đang làm trong đường dẫn yêu cầu của bạn đến /index.php/somepath/morestuff/ohno%foobar và cuộn cảm, cho bạn lỗi đó.

Nếu bạn đang chạy Apache 2.2, mod_rewrite, hãy thêm cờ B cho mục đích này, cho phép bạn tự động thoát khỏi các liên kết ngược được ghi đè vào URL của mình. Thêm vào danh sách cờ hiện tại của bạn nên giải quyết vấn đề trong trường hợp đó:

RewriteRule ^.*$ index.php/$0 [B,L] 

Ngoài ra còn có một escapeRewriteMap đó là có sẵn như là một bản đồ nội bộ trong các phiên bản Apache trước của mod_rewrite, nhưng tiếc là bản đồ này phải được kích hoạt tại cấp cấu hình máy chủ hoặc máy chủ ảo, vì vậy có thể không khả dụng nếu bạn đang chạy trang web của mình trên lưu trữ được chia sẻ. Nó làm điều tương tự, mặc dù một chút cố ý hơn.

Trong/cấu hình máy chủ ảo máy chủ của bạn:

RewriteMap escape int:escape 

Sau đó, bất cứ nơi nào bạn xác định quy tắc của bạn:

RewriteRule ^.*$ index.php/${escape:$0} [L] 

Hãy ghi nhớ rằng CodeIgniter không cần phải sử dụng PATH_INFO để có được những yêu cầu thông tin, và sử dụng REQUEST_URI là hoàn toàn có thể chấp nhận ở đây nếu bạn không sử dụng mod_rewrite để thực hiện bất kỳ phép biến đổi nào khác (và sẽ tránh hoàn toàn nhức đầu này). Tôi nghĩ theo mặc định CodeIgniter được thiết lập để nhận yêu cầu từ AUTO (giả sử tôi chưa nhận được các khuôn khổ của tôi lẫn lộn), vì vậy chỉ đơn giản là không viết lại yêu cầu đến URL với thông tin đường dẫn sẽ đủ để thực hiện thay đổi đó.

+0

Tôi đang chạy apache 2.2 nhưng cờ B đó không hoạt động ... nó gây ra 500. –

+0

@Ken Struys - Nhật ký lỗi của bạn phải nói gì về 500? –

+0

cho biết cờ B không xác định. Tôi đang chạy 2.2.3 và 2.2.7 đã thêm cờ B. Tôi có quyền truy cập đầy đủ vào máy chủ (không chia sẻ lưu trữ) vì vậy tôi có thể làm bất cứ điều gì tôi cần làm để apache. –

1

Trong jquery trước khi thiết để URL mà bạn có để mã hóa như này này sẽ mã hóa% và/cả ..... "encodeURI (encodeURI (encodeURIComponent ('string của bạn')));"

trên php hoặc xem trang web mà bạn có để giải mã như sau

urldecode (urldecode (htmlspecialchars ('chuỗi mã hóa của bạn' , ENT_QUOTES)))

Các vấn đề liên quan