Приложение CakePHP в каталоге прерывает перенаправления, сделанные с помощью строки запроса - PullRequest
1 голос
/ 10 января 2012

My CakePHP 2.0 URL-адрес приложения: http://localhost/testapplication/

, и когда я перенаправляю при входе по ссылке, я использую строку запроса, например,

localhost/testapplication/login?continue=/testapplication/admin/posts

Перенаправление выполняется с помощью:

            if(isset($this->params['url']['continue']))
            {
                $pathtoredirect = $this->params['url']['continue'];
            }
            else
            {
                $pathtoredirect = $this->Auth->redirect();
            }

            return $this->redirect($pathtoredirect);

Однако, когда я сделаю перенаправление, я получу URL, например:

localhost/testapplication/testapplication/admin/posts

Как вы можете видеть, он перенаправляет на переданный URL, но поскольку переданный URL также содержит базовый каталог, он дублирует его, ломая перенаправление URL и заканчивая на 404!

Любые идеи о том, как обойти этопроблема?

Просто для подтверждения:

  • URL-адрес начинается с /, поэтому он перенаправляет на корневой уровень, но проблема в том, чтокорневой уровень - это каталог, поэтому он дублирует его, поскольку он также передается в запросе

Ответы [ 3 ]

1 голос
/ 10 января 2012

Если вы строите путь одним из следующих способов:

$continue = Router::url(array('controller' => 'admin', 'action' => 'posts'));
$continue = Router::url('/admin/posts');

, затем Router::url будет предшествовать базовый путь /application. Затем, если вы снова вызовете Router::url для полученного URL (или redirect к нему), Router::url снова добавит его. Вот как это работает, и вы ничего не можете с этим поделать.

В действительности, URL /application/admin/posts является неоднозначным, но CakePHP читает его как controller=application, action=admin, а первый аргумент - posts.

Единственные способы обойти это:

Используйте абсолютный URL:

$continue = Router::url(array('controller' => 'admin', 'action' => 'posts'), true);

Или убедитесь, что Router::url вызывается только один раз, например ::1010*

$continue = '/admin/posts';

Или после входа в систему

$pathtoredirect = FULL_BASE_URL . $this->params['url']['continue'];
0 голосов
/ 11 января 2012

Хорошо, исправление должно было сделать следующее:

Получите полный URL (как уже упоминалось) здесь с помощью помощника:

class LinkHelper extends AppHelper
{
    public function selfURL()
    {
        $pageURL = 'http';

        //if ($_SERVER["HTTPS"] == "on")
        if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')
        {
            $pageURL .= "s";
        }
        $pageURL .= "://";
        if ($_SERVER["SERVER_PORT"] != "80")
        {
            $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
        } 
        else
        {
            $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
        }

        $pageURL = urlencode($pageURL);

        return $pageURL;  
    }

}

Затем при использовании URL-адресов обязательно закодируйте и декодируйте их для использования в адресной строке

например. $pathtoredirect = urldecode($this->params['url']['continue']);

0 голосов
/ 10 января 2012

Кажется, у вас есть несколько вариантов здесь. Если $this->params['url']['continue'] - это именно то, что вы передаете в строке запроса, можете ли вы изменить строку запроса так, чтобы она была просто /admin/posts, поэтому полный URL-адрес будет application/admin/posts?

Возможно, вам не придется это делать, но мне нужно точно знать, как выглядит $this->params['url']['continue']. Пожалуйста, сделайте die(debug($this->params['url']['continue'])); где-нибудь перед вашим перенаправлением, чтобы мы могли продолжить расследование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...