2010-02-09 20 views
7

SOLVED:Làm cách nào để chuyển "/" qua GET trong URI?

URI này hoạt động:

/controller/action?ret=%2F 

Tôi muốn vượt qua một thêm "/" tham số để các hành động điều khiển. Vì vậy, tôi đã làm điều này:

$par1 = urlencode('/'); 
$this->_redirect('/controller/action/par1/' . $par1); 

Nhưng tôi nhận được thông báo lỗi này:

Not Found 

The requested URL /controller/action/ret// was not found on this server. 

Khi tôi gọi là hành động điều khiển mà không cần bất kỳ thông số hoặc với tham số "aaa" nó hoạt động. Các URI này hoạt động:

/controller/action 
/controller/action/par1/aaa 
/controller/action/par1/jfhsdajkhfui454fs 
/controller/action/par1 
/controller/action/par1/ 

Bạn có thể đặt http://example.com trước tất cả các URI tương đối ở trên và nó giống nhau.

Trả lời

9

Bạn gần như đã làm đúng. Sai lầm nhỏ duy nhất là urlencode sẽ thích sử dụng dấu cộng để biểu thị dấu cách, chỉ phù hợp trong tham số truy vấn và không phải là phần đường dẫn. rawurlencode sẽ tốt hơn ở đây.

Tuy nhiên, đó không phải là lý do nó không hoạt động. Bạn đã tạo đường dẫn /controller/action/par1/%2F, đó là chính xác.

Nó không hoạt động trong thực tế vì bạn đang cố gắng bảo vệ bạn (theo cách không hiệu quả) từ các vấn đề truyền tải thư mục. Nếu bạn bao gồm một chuỗi %2F trong đường dẫn URL, Apache sẽ mặc định nhảy vào và hiển thị trang 404 của riêng bạn (bỏ qua bất kỳ cài đặt sai nào). Để tắt tính năng này (IMO: Misfeature), bạn có thể sử dụng chỉ thị cấu hình AllowEncodedSlashes.

Cho dù bạn thực sự có thể truy xuất dấu gạch chéo được mã hóa khi quay trở lại tập lệnh của bạn hay không là một loại sâu khác. Do thiết kế xấu của biến số PATH_INFO trong thông số CGI ban đầu, nhiều môi trường sẽ không thể xem được %2F như bất kỳ thứ gì khác với mã vạch chưa được mã hóa /, có khả năng phá vỡ định tuyến bạn đang làm từ các phần đường dẫn. Nó thường là tốt nhất để tránh có dấu gạch ngang trong các phần đường dẫn, bởi vì Apache không phải là máy chủ duy nhất hoặc ngôn ngữ sẽ bị nhầm lẫn bởi chúng. Nói chung, bạn nên sử dụng tham số truy vấn cho đầu vào mà bạn cần để có thể chấp nhận bất kỳ chuỗi byte hoặc ký tự nào, vì phần đường dẫn có vấn đề thực tế trong nhiều máy chủ với (a) /, (b) \, (c) ký tự NUL và (d) các chuỗi rỗng.

+0

Tôi thực sự quản lý để giải quyết điều này bằng cách sử dụng URI như thế này:/controller/action? Ret =% 2F :) –

+0

Câu trả lời rất nhiều thông tin, bobince.Tôi không quen thuộc với tùy chọn cấu hình AllowEncodedSlashes, bản thân mình. –

2

Hãy thử %2F. Tôi không nghĩ rằng urlencode sẽ mã hóa '/' vì đó là cú pháp URL hợp lệ.

[Chỉnh sửa]: đánh giá cao các phiếu bầu nhưng dường như câu trả lời của tôi không chính xác. Xem câu trả lời đúng (và chi tiết hơn) của bobince bên dưới ở trên.

+0

'urlencode' không mã hóa'/'. – bobince

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