Как написать файл .htaccess, чтобы маршрутизация URL-адресов CodeIgniters работала?

Я запускаю среду LAMP с CodeIgniter. Я хочу иметь возможность использовать его шаблон URL, например, http://localhost/controller/function/ID, но по умолчанию он должен быть http://localhost/index.php/controller/function/ID. В руководстве пользователя сказано, что мне нужен файл .htaccess, чтобы сделать возможным первый стиль, и использует его в качестве примера:

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

Но я не понимаю, как это работает. Куда мне поместить .htaccess? Должен ли он быть в корне сервера?

Что делать, если у меня есть несколько сайтов, работающих на моем сервере. Должен ли я помещать его в /var/www/ и указывать условия в зависимости от того, какие каталоги загружаются? Или я могу просто поставить его в /var/www/site_using_codeigniter/? Я не уверен, как заставить это работать.

Могу ли я сделать так, чтобы он отображался на URL-адрес MVC только в том случае, если запрошенный URL-адрес фактически не существует? Например, http://localhost/articles/2009/some-article-name не будет каталогом на сервере, поэтому он будет сопоставлен с index.php и передан codeigniter, но http://localhost/forum будет существовать на сервере, но не должен обрабатываться codeigniter.

Какие-нибудь другие вещи, которые я должен сделать с файлом .htaccess? Что хорошего можно прочитать о них?

Обновить

Я изменил свой файл конфигурации следующим образом:

$config['index_page'] = ""; //used to be "index.php"

и добавил это в файл .htaccess:

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

и сохранил его в корневом каталоге моего сайта (в данном случае /var/www/cms/)

Я зашел в /etc/apache2/conf.d/security (который включен в /etc/apache2/apache2.conf) и сделал следующее:

<Directory />
    AllowOverride All #was "none", but this was all commented out
    Order Deny,Allow
    Deny from all
</Directory>

Однако он все еще не работает. Если я перейду к http://localhost/cms/index.php/hello, он напечатает «Привет», но http://localhost/cms/hello выдает ошибку 404.

Идеи?

обновление: большой успех!

Мне пришлось копаться в моих файлах конфигурации apache, чтобы, наконец, найти, где были определены все каталоги (я никогда не возился с файлами конфигурации сервера до этой даты), и нашел надоедливую AllowOverride None, которая мешала моим планам величия.

Теперь он работает отлично. Все ответы здесь жизнеспособны и работают.


person Carson Myers    schedule 09.09.2009    source источник


Ответы (9)


В своем system/application/config/config.php измените

$config['index_page'] = "index.php";

to

$config['index_page'] = "";

и в свой .htaccess добавьте это:

RewriteEngine on
RewriteCond $1 !^(index\.php|images|stylesheets|scripts|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

Добавьте файл .htaccess в тот же каталог, где находится папка system, поэтому в корневом каталоге CodeIgniter у вас должно быть

  • система/
  • гид пользователя/
  • index.php
  • .htaccess
  • лицензия.txt

Кроме того, поскольку на вашем сервере работает несколько сайтов, вам может понадобиться VirtualHosts. Добавьте это в последнюю часть вашего apache2.conf для каждого сайта, который у вас есть:

Listen *:11000
<VirtualHost *:11000>
     ServerAdmin [email protected]
     DocumentRoot "/var/www/cms"
     ServerName you-dummy.com
     <Directory "/var/www/cms">
          AllowOverride All
          Options +Indexes
          DirectoryIndex index.php
          Order allow,deny
          Allow from all
     </Directory>
     ErrorLog logs/cms_log
     CustomLog logs/cms_log common
</VirtualHost>

Теперь вы можете получить доступ к сайту с http://localhost:11000/ и получить доступ к контроллеру с помощью http://localhost:11000/hello.

person Randell    schedule 09.09.2009
comment
но .htaccess находится в /var/www/cms/, и я настроил базовый URL-адрес как http://localhost/cms. В любом случае, ни один из URL-адресов не работает - person Carson Myers; 09.09.2009
comment
это заставляет его отказаться от соединения, то же самое, если я также изменю порт на 80. Должно быть, я делаю что-то ужасно неправильно, я не думаю, что обычно это так сложно сделать. - person Carson Myers; 09.09.2009
comment
Убунту линукс. Но знаете что, вместо того, чтобы хранить все в одном файле httpd.conf, он разбросан по множеству. Я решил, что, поскольку вообще ничего не работает, я просмотрел все включения конфигурации и нашел, где были определены каталоги, и изменил там AllowOverride. Это еще не работает, но я собираюсь попробовать все снова, теперь, когда .htaccess действительно открывается. - person Carson Myers; 09.09.2009
comment
Я прочитал твой ответ. Да, это AllowOverride, установленное на None, нелегко поймать. Вы можете изменить его почти только один раз для каждой установки, поэтому о нем часто забывают. - person Randell; 09.09.2009
comment
+1 Рэнделл ваше право. У меня была та же проблема, что исправила. Спасибо. - person Fábio Antunes; 02.01.2010
comment
Вы уверены, что .htaccess нужно добавить в папку system? Я думал, что это принадлежит корню. - person CyberJunkie; 19.07.2012

Пробовал ответить здесь, но это не сработало для меня. Итак, я попробовал следующее, и это сделало...

создайте .htaccess в корневом каталоге, где доступен index.php вместе с license.txt. введите следующий код в файл и сохраните его:

DirectoryIndex index.php
RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]  

Выполнено! попробуй и обязательно получится. Надеюсь, поможет

person sys_debug    schedule 14.05.2012

Были некоторые проблемы с поиском, где изменить «AllowOverRide All».

Из этого руководства я нашел файл (по умолчанию).

Удалить URL-адрес Index.php CodeIgniter в Ubuntu

  1. Предварительное примечание. Я выполняю все шаги в этом руководстве с привилегиями root, поэтому убедитесь, что вы вошли в систему как root:

    sudo su
    
  2. Включить модуль mod_rewrite в apache. Сначала включите модуль следующим образом:

    a2enmod rewrite
    

    Измените все вхождения «AllowOverRide None» на «AllowOverRide All». В основном все от «Нет» до «Все» в следующем файле:

     gedit **/etc/apache2/sites-available/default**
    

    Перезапустите Апач:

    /etc/init.d/apache2 restart
    
  3. Откройте файл config.php на CodeIgniter (application\config). Удалить index.php на $config['index_page'] = "index.php";

    $config['index_page'] = "";
    
  4. Создайте файл .htaccess в корневом каталоге CodeIgniter. Заполните файл этим кодом:

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

Теперь Index.php на URL-адресе CodeIgniter исчезает

person The Demz    schedule 24.05.2012

Этот конкретный файл .htaccess выглядит так, как будто он должен находиться в корневом каталоге вашего сайта (имеется в виду текущий исполняемый сайт).

Ознакомьтесь с документацией по RewriteCond, чтобы узнать, какие другие типы условий, которые вы можете указать. В основном RewriteRule будет применяться только в том случае, если все его предыдущие RewriteCond совпадают. Вы можете попробовать добавить эти правила для перенаправления только в том случае, если запрошенный URL-адрес не существует:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

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

Что еще можно сделать с файлом .htaccess, документы Apache для htaccess — всегда хорошее место для начала. Чаще всего используется для проверки подлинности для каждого каталога. Большинство директив конфигурации сервера поддерживаются в файле .htaccess (при условии, что сервер AllowOverride говорит об этом), но некоторые из них имеют другой синтаксис.

person We Are All Monica    schedule 09.09.2009

Поместите это в корень документа вашего веб-сайта.

Если у вас несколько сайтов, поместите его вверху каждого такого сайта.

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

Таким же образом вы можете исключить определенные каталоги (например, /articles).

person cletus    schedule 09.09.2009

У меня были те же проблемы с изображениями ссылок CodeIgnitor, js, css. Теперь все работает благодаря вам, ребята! Я выполнил следующие шаги. объединил все остальные комментарии в свой сценарий для работы. Надеюсь, это поможет кому-то.

  1. изменен httpd.conf

    <Directory --your root dir-- />
        AllowOverride All #was "none", but this was all commented out
        Order Deny,Allow
        Deny from all
    </Directory>
    
  2. создал пустой файл .htaccess в каталоге htdocs\yoursite (корневой каталог сайта) и вставил следующее.

    DirectoryIndex index.php
    RewriteEngine on
    RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico)
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
    
person pradeep.rana    schedule 12.07.2012

Попробуйте этот, он работает идеально

DirectoryIndex index.php
RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]  
person Prashant    schedule 24.10.2013

RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico)
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

Простой в .htaccess в корневой папке! Работает на меня.

person user2606817    schedule 22.07.2013

person    schedule
comment
Я также вставил это в свой файл httpd.conf, но безуспешно. - person Carson Myers; 09.09.2009