2009-12-20 1 views
0

Так что моя проблема выглядит странно, это происходит только при проверке приложения в автономном режиме (на моем ПК с 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? Я слепой?).

+0

Вы могли бы разместить код для $ this-> redirect? – streetparade

+0

$ this -> _ redirect - это встроенный помощник в Zend Framework, но я включил источник из ZF в свой пост. –

+0

я обновить мой ответ – SMka

ответ

1
  1. проверить ваш php.ini
    php_flag magic_quotes_gpc off Должно быть Off в Интернете и локальных серверов

  2. не используют urlencode'ret' => urlencode('admin/index/photos')) потому что url помощник имеет четвертый параметр $encode = true и это true по умолчанию

  3. показать нам вывод $this->url(array('module' => 'admin'..... на сервере и на localhost

я использую WAMP дома, и он работает как шарм

UPDATE 1
попробовать $this->_redirect('/'. ltrim(urldecode($request->getParam('ret')), '/'));

UPDATE 2;

ViewScript

<a href="<?php 

echo $this->url(array('module' => 'default', 
        'controller' => 'index', 
        'action' => 'test-encoded-redirect', 
        'ret' => urlencode('default/static/faq')), 
      null, 
      true); 

         ?>">test me</a> 


    <?php 
    class IndexController extends Smapp_Controller_Action 
    { 

     public function testEncodedRedirectAction() 
     { 

          // ddump($this->_getAllParams()); 
      // ddump output 
      // Array ( 
      // [controller] => index 
      // [action] => test-encoded-redirect 
      // [ret] => default%2Fstatic%2Ffaq 
      // [module] => default 
      //) 


      $ret = '/' . ltrim(urldecode($this->_getParam('ret')), '/'); 
      // echo $ret; 
      // output: /default/static/faq 

      $this->_redirect($ret); 
     } 
    } 

это работает!

+0

Магические кавычки отключены как на локальном, так и на веб-сервере. Чеч закончил мой пост. –

+0

И проблема с urlencode() не является проблемой. Если я избавлюсь от него, проблема не исчезнет. Плюс это старое приложение, и мне пришлось бы удалить этот urlencode() в десятках просмотров (в более старых версиях ZF четвертый параметр не был там, я думаю, поэтому они заставили старые приложения ZF не сломаться). –

+0

Я пробовал это, та же проблема. –

Смежные вопросы