2012-01-25 27 views
5

Tôi đang gặp phải hành vi bất thường bằng cách sử dụng phương thức điều khiển Zend _redirect.Lỗi Zend _redirect: prepends url cơ sở hai lần

Bản sao đơn đăng ký của tôi được cung cấp qua liên kết tượng trưng trong số DocumentRoot của tôi. Ngoài ra bộ định tuyến mặc định của tôi được tùy chỉnh để đáp ứng với mô hình này:

http://localhost/<appSymLink>/<param_A>/<controller>/<action>/

Từ một bộ điều khiển, tôi xây dựng một URL như vậy:

$url = $this->_helper->url('action', 'controller', $param_A = 'valueA');

Nếu tôi truy cập vào url:

http://localhost/<appSymLink>/<param_A>/<controller>/<action>/

Biến này chứa các chuỗi sau:

/<appSymLink>/<param_A>/<controller>/<action>/

Và khi tôi gọi

$this->_redirect($url);

Người sử dụng được một cách rõ ràng chuyển hướng đến con đường này, với đường cơ sở thừa.

/<appSymLink>/<appSymLink>/<param_A>/<controller>/<action>/

Zend dường như được thêm vào trước các đường cơ sở hai lần.

Bản sao ứng dụng của đồng nghiệp của tôi nằm trong số DocumentRoot và anh ấy không gặp sự cố này.

Xác định một đường cơ sở có sản phẩm nào bên trong hành động, chỉ cần trước khi phẫu thuật, hoạt động giống như vậy:

$this->getRequest()->setBaseUrl('');

Đây không phải là một giải pháp khả thi rõ ràng. Mặt khác, làm điều này trong một plugin điều khiển tại routeShutdown loại bỏ cả hai lần xuất hiện của thư mục ứng dụng.

Có ai có lời khuyên giải pháp cho vấn đề này hay bất kỳ mẹo nào để tìm kiếm bốn sự cố khác?

Trả lời

6

Nếu chuyển hướng bằng URL được tạo từ trình trợ giúp Url, bạn cần thông báo cho trình chuyển hướng biết rằng URL này đã được đặt trước bằng URL cơ sở.

Đơn giản chỉ cần sử dụng sau đây

return $this->redirect($url, array('prependBase' => false)); 
4

Hãy thử và thiết lập các tùy chọn để prependBaseFALSE:
$this->_redirect($url, array('prependBase' => FALSE);

Excerpt from ZF reference:

_redirect($url, array $options = array()): redirect to another location. This method takes a URL and an optional set of options. By default, it performs an HTTP 302 redirect.

The options may include one or more of the following:

exit: whether or not to exit immediately. If requested, it will cleanly close any open sessions and perform the redirect.

You may set this option globally within the controller using the setRedirectExit() accessor.

prependBase: whether or not to prepend the base URL registered with the request object to the URL provided.

You may set this option globally within the controller using the setRedirectPrependBase() accessor.

code: what HTTP code to utilize in the redirect. By default, an HTTP 302 is utilized; any code between 301 and 306 may be used.

You may set this option globally within the controller using the setRedirectCode() accessor.

nếu công việc doesnt này tôi có thể đề nghị các helper hành động 'Redirector' thường được sử dụng:
$this->_helper->getHelper('Redirector')->gotoSimple($action, $controller = null, $module = null, array $params = array())
Action Helper Redirector

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