Так что моя проблема выглядит странно, это происходит только при проверке приложения в автономном режиме (на моем ПК с WampServer), тот же код работает на 100% правильно в Интернете.Проблема с URL-кодированными параметрами в URL-адресе helper
Вот как я использую помощника (только пример):
<a href="<?php
echo $this->url(array('module' => 'admin',
'controller' => 'index',
'action' => 'approve-photo',
'id' => $this->escape($a->id),
'ret' => urlencode('admin/index/photos')),
null,
true);
?>" class="blue">approve</a>
Интернет, эта ссылка отлично работает, он переходит к действию, который выглядит примерно так:
public function approvePhotoAction()
{
$request = $this->getRequest();
$photos = $this->_getTable('Photos');
$dbTrans = false;
try {
$db = $this->_getDb();
$dbTrans = $db->beginTransaction();
$photos->edit($request->getParam('id'),
array('status' => 'approved'));
$db->commit();
} catch (Exception $e) {
if (true === $dbTrans) {
$db->rollBack();
}
}
$this->_redirect(urldecode($request->getParam('ret')));
}
Итак онлайн , он одобряет фотографию и перенаправляет обратно URL-адрес, который закодирован как параметр «ret» в URL-адресе («admin/index/photos»).
Но в автономном режиме с WampServer я нажимаю на ссылку и получить сообщение об ошибке 404, как это:
Not Found
The requested URL /public/admin/index/approve-photo/id/1/ret/admin/index/photos was not found on this server.
Какого черта?
Я использую последнюю версию WampServer (WampServer 2.0i [11/07/09]). Все остальное работает.
Вот мой файл .htaccess, на всякий случай:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]
# Turn off magic quotes
#php_flag magic_quotes_gpc off
Я использую виртуальные хосты для тестирования проектов ZF на моем локальном компьютере. Вот как я добавляю виртуальные хосты.
httpd.conf:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName myproject
DocumentRoot "C:\wamp\www\myproject"
</VirtualHost>
хосты файл:
127.0.0.1 myproject
Любая помощь будет оценена, так как это делает тестирования и отладки проектов на моем локальном хосте кошмар и почти невыполнимой задачей. Я должен загрузить все в Интернете, чтобы проверить, работает ли он :(
UPDATE:
Исходный код помощника _redirect (встроенный помощник ZF):
/**
* Set redirect in response object
*
* @return void
*/
protected function _redirect($url)
{
if ($this->getUseAbsoluteUri() && !preg_match('#^(https?|ftp)://#', $url)) {
$host = (isset($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:'');
$proto = (isset($_SERVER['HTTPS'])&&$_SERVER['HTTPS']!=="off") ? 'https' : 'http';
$port = (isset($_SERVER['SERVER_PORT'])?$_SERVER['SERVER_PORT']:80);
$uri = $proto . '://' . $host;
if ((('http' == $proto) && (80 != $port)) || (('https' == $proto) && (443 != $port))) {
$uri .= ':' . $port;
}
$url = $uri . '/' . ltrim($url, '/');
}
$this->_redirectUrl = $url;
$this->getResponse()->setRedirect($url, $this->getCode());
}
UPDATE 2:
Выход вспомогательного устройства в автономном режиме:
/admin/index/approve-photo/id/1/ret/admin%252Findex%252Fphotos
И он-лайн (то же самое):
/admin/index/approve-photo/id/1/ret/admin%252Findex%252Fphotos
UPDATE 3:
OK. Проблема была в самом деле с конфигурацией виртуального хоста. Корень документа был установлен в C: \ wamp \ www \ myproject вместо C: \ wamp \ www \ myproject \ public.
И я использовал эту HTAccess для перенаправления на общую папку:
RewriteEngine On
php_value upload_max_filesize 15M
php_value post_max_size 15M
php_value max_execution_time 200
php_value max_input_time 200
# Exclude some directories from URI rewriting
#RewriteRule ^(dir1|dir2|dir3) - [L]
RewriteRule ^\.htaccess$ - [F]
RewriteCond %{REQUEST_URI} =""
RewriteRule ^.*$ /public/index.php [NC,L]
RewriteCond %{REQUEST_URI} !^/public/.*$
RewriteRule ^(.*)$ /public/$1
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^.*$ - [NC,L]
RewriteRule ^public/.*$ /public/index.php [NC,L]
Черт, я не знаю, почему я забыл об этом, я думал, что виртуальный хост был правильно настроен в общую папку, Я был на 100% уверен в этом, я также дважды проверил его и не увидел проблемы (wtf? Я слепой?).
Вы могли бы разместить код для $ this-> redirect? – streetparade
$ this -> _ redirect - это встроенный помощник в Zend Framework, но я включил источник из ZF в свой пост. –
я обновить мой ответ – SMka