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 escape
RewriteMap
đó 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 đó.
Có lý do nào bạn cần '% 25' không? '% 25' là mã cho một dấu'% '. – Powerlord
@ 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. –