2010-10-14 45 views
5

Tôi đang thử nghiệm ứng dụng Zend Framework của mình bằng Selenium và PHPUnit. Tôi có một bài kiểm tra cần phải mở một URL có chứa một URL được mã hóa.Zend Framework: URL mã hóa giải mã Apache thay vì chuyển URL được mã hóa?

$redirectToLocation = urlencode('/myothercontroller/action'); // %2Fmyothercontroller%2Faction 
$this->openAndWait('/controller/action/thenRedirectTo/' . $redirectToLocation); 

Nhưng khi tôi chạy thử nghiệm của tôi, trình duyệt đã cố gắng mở URL giải mã:

/controller/action/thenRedirectTo//myothercontroller/action 

Những gì tôi nên làm gì để có được selen để mở URL mã hóa?

Cập nhật: Thực ra ... Hóa ra selen đang làm công việc của nó, nhưng có vẻ như nếu Apache được giải mã URL trước khi nó được cho là điều khiển:

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

Làm thế nào tôi nên khắc phục vấn đề này ?

Cập nhật: Đây là toàn bộ cuộc hội thoại về cùng một vấn đề mà tôi đang gặp phải: http://old.nabble.com/URL-Encoding-td18850769.html. Cách giải quyết của họ là base64 mã hóa url, nhưng điều đó không đủ tốt cho tôi. Tôi có thể sử dụng giải pháp này trong ngắn hạn, nhưng tôi muốn biết nguyên nhân thực sự của vấn đề này là gì, vì vậy tôi có thể loại bỏ nó.

Cập nhật: Tôi có một đồng nghiệp nghĩ rằng có thể có vấn đề với cách Zend Framework định tuyến yêu cầu. Bạn có nghĩ rằng đó có thể là trường hợp?

Trả lời

0

Sự cố thú vị. Cá nhân tôi chưa bao giờ gặp phải bất kỳ vấn đề nào khi truyền một URL khác trong chuỗi truy vấn, tức là/controller/action/thenRedirectTo? Q =% 2Fmyothercontroller% 2Faction, nhưng tôi đã không sử dụng Apache trong một thời gian dài, và đó không phải chính xác những gì bạn ' đang cố gắng làm.

Một giải pháp khả thi có thể là mã hóa url kép.

$redirectToLocation = urlencode(urlencode('/myothercontroller/action')); 
$this->openAndWait('/controller/action/thenRedirectTo/' . $redirectToLocation); 

Có lẽ Apache sẽ chỉ url giải mã một cấp.

+1

Chưa thử điều đó, nhưng nó có thể hoạt động. Tuy nhiên, tôi muốn điều chỉnh Apache để hoạt động chính xác hơn là hack mã của tôi. – Andrew

+0

Đó là một giải pháp xấu. Tôi đồng ý rằng Apache không nên lộn xộn với điều này. Chắc chắn đây là cấu hình bằng cách nào đó? – mcv

0

Tôi đã gặp phải hành vi này trước đây và đó là mod_rewrite đang thực hiện giải mã. Theo như tôi biết cách duy nhất để có được xung quanh nó là urlencode phần của URL yêu cầu mà cần phải bảo vệ các ký tự đặc biệt hai lần.

0

Bạn nên thiết lập mod_rewrite của bạn trong chế độ gỡ lỗi trong Apache và nhìn vào những gì anh ấy làm:

RewriteEngine on 
RewriteLog /tmp/rewrite.log 
RewriteLogLevel 9 

và chỉ cho chúng ta ZF của bạn Rewrite quy tắc. nó khá chắc chắn dựa trên% {QUERY_STRING} là url được giải mã cạnh tranh. Chúng tôi có thể thử làm lại nó với% {THE_REQUEST}, đó là url không giải mã. Điều tốt nhất sẽ chỉ xử lý% {THE_REQUEST} cho bộ điều khiển phù hợp.

Một giải pháp khác có thể đang sử dụng mã hóa base64 trên url, do đó mod_rewrite và bất kỳ công cụ nào khác sẽ không bao giờ bắt được nó dưới dạng thông tin url.

Một điều khác cần kiểm tra là [B] trên mod_rewrite, như được giải thích tại đây: How to encode special characters using mod_rewrite & Apache?. Nhưng tôi tự hỏi là sẽ không phá vỡ quy tắc viết lại.

0

Dường như điều này Zend Framwork issue liên quan đến vấn đề của bạn. Để xác minh mở Zend/Controller/Request/Http.php và loại bỏ các cuộc gọi chức năng urldecode nhưng giữ các biến tại chỗ và kiểm tra lại mã của bạn.

2

Đây là một tính năng "Apache". Các dấu gạch chéo được mã hóa được tự động giải mã và được gửi tới ứng dụng (php). Do đó nó được công nhận là một uri dài thay vì một uri với một uri được mã hóa làm tham số.

Tuy nhiên, bạn có thể tắt tính năng này bằng cách sử dụng AllowEncodedSlashes On trong cấu hình của mình. Thông tin thêm tại Apache manual. Xin lưu ý ngữ cảnh của chỉ thị này là cấu hình máy chủ và máy chủ ảo, do đó bạn không thể đặt nó trong tệp .htaccess.