Проблемы с перенаправлением воспламенителя кода с параметрами GET - PullRequest
3 голосов
/ 23 июля 2010

У меня проблемы с маршрутизацией воспламенителя кода.

http://www.mysite.com идет к правильному контроллеру и делает правильные вещи.Однако http://www.mysite.com/?ref=p&t2=455 вызывает ошибку 404.Также http://www.mysite.com/mycontroller/mymethod/?ref=p&t2=455 работает нормально.

Я изменил uri_protocol в файле config.php и попробовал другие значения.Авто, кажется, работает лучше всего.

Моя теория заключается в том, что воспламенитель кода использует параметры запроса для маршрутизации.Проблема заключается в том, что эти параметры запроса не имеют ничего общего с маршрутизацией.

Как я могу сообщить воспламенителю кода, чтобы он игнорировал параметры запроса для контроллера по умолчанию?

Обратите внимание, я следовал инструкциям в Интернете, чтобы удалитьindex.php из URL.Я не думаю, что это вызывает проблему, но вот мой файл .htaccess на всякий случай:

RewriteEngine On
RewriteBase /~trifecta/prod/

#Removes access to the system folder by users.
#Additionally this will allow you to create a System.php controller,
#previously this would not have been possible.
#'system' can be replaced if you have renamed your system folder.
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]
#Checks to see if the user is attempting to access a valid file,
#such as an image or css document, if this isn't true it sends the
#request to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#This last condition enables access to the images and css folders, and the robots.txt file
#Submitted by Michael Radlmaier (mradlmaier)
RewriteCond $1 !^(index\.php|images|robots\.txt|css)
RewriteRule ^(.*)$ index.php?/$1 [L]

Ответы [ 5 ]

5 голосов
/ 29 июля 2010

С этим правилом перезаписи RewriteRule ^(.*)$ /index.php?/$1, вот несколько примеров перезаписей, которые происходят:

http://www.mysite.com =>
http://www.mysite.com/index.php?/ (на самом деле, это может вообще не переписываться)

http://www.mysite.com/mycontroller/mymethod/?ref=p&t2=455 =>
http://www.mysite.com/index.php?/mycontroller/mymethod/?ref=p&t2=455

http://www.mysite.com/?ref=p&ts=455 =>
http://www.mysite.com/index.php?/?ref=p&t2=455

Первый из них будет работать независимо от того, переписывается он или нет. CodeIgniter обрабатывает либо пустую строку запроса (что легко), либо строку запроса просто "/".

Второй (который также работает) переписывается, но CodeIgniter может обработать строку запроса, которая составляет /mycontroller/mymethod/?ref=p&t2=455. CI превращает это в массив сегментов как

[0] => mycontroller
[1] => mymethod
[2] => ?ref=p&t2=455

Индекс массива 2 в конечном итоге игнорируется всеми вашими действиями.

Третий (который не работает, переписывается, и CodeIgniter вообще не может обработать свою строку запроса. Его строка запроса переписывается в: /?ref=p&t2=455. Это делает для массива сегменты, которые выглядят так:

[0] => ?ref=p&t2=455

, который не соответствует ни одному контроллеру на вашем сайте.

Возможно, вы все исправите, изменив RewriteRule с
RewriteRule ^(.*)$ /index.php?/$1 до
RewriteRule ^(.*)$ /index.php/$1
в этот момент вы, вероятно, захотите изменить конфигурацию uri_protocol обратно на PATH_INFO.

0 голосов
/ 02 августа 2010

Попробуйте CodeIgniter Файл Super .htaccess

0 голосов
/ 29 июля 2010

Вот как я обошёл это: 1. У меня есть стандартная перезапись в .htaccess:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [QSA,L]

Это, вероятно, не связано, но ...

  1. в index.php файл вне папки приложения, которую я добавил:

$ pattern = "/\?.*$/"; $ replace = ''; $ _SERVER ['REQUEST_URI'] = preg_replace ($ pattern, $ replace, $ _SERVER ['REQUEST_URI']);

это останавливает codeigniter от попытки использовать строку запроса в запросе. Теперь вам действительно нужны переменные $ _GET? Их нужно проанализировать из $ _SERVER ['REDIRECT_QUERY_STRING'], который будет установлен, если вы использовали mod_rewrite, как указано выше.

0 голосов
/ 28 июля 2010

При следующей конфигурации у меня все работает нормально. http://www.site.com/?x=y перенаправляется на метод индекса контроллера по умолчанию.

.htaccess

RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ index.php/$1 [L]

система / приложение / Config / config.php

$config['base_url'] = "http://www.site.com/";
$config['index_page'] = "";
$config['uri_protocol'] = "PATH_INFO";
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-?';

Помните, чтобы добавить? в список разрешенных символов в URL. Возможно, это вызывает проблемы. Я просто попробовал эту установку с чистой установкой CodeIgniter, и она работала нормально. Это были единственные изменения, которые мне нужно было сделать.

0 голосов
/ 28 июля 2010

Кажется, это ограничение в способе разработки CodeIgniter, а не в результате вашей маршрутизации и / или .htaccess.Кто-то подал отчет об ошибке здесь .Однако вместо использования этого и добавления кода mymethod в метод index контроллера по умолчанию вы можете использовать функцию _remap() следующим образом:

function _remap($method)
{
    if ($method == 'index' && count($_GET) > 0)
    {
        $this->mymethod();
    }
    else
    {
        $this->index();
    }
}
...