Как написать файл .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/apache 2/conf.d/security (который включен /etc/apache 2/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, он напечатает "Hello there", но http://localhost/cms/hello дает ошибку 404.

Идеи?

update: græt success!

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

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

Ответы

Ответ 1

В system/application/config/config.php, измените

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

к

$config['index_page'] = "";

и в .htaccess добавить следующее:

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

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

  • система /
  • user_guide/
  • index.php
  • .htaccess
  • license.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.

Ответ 2

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

создайте .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]  

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

Ответ 3

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

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

Удалить Index.php CodeIgniter URL на Ubuntu

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

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

    a2enmod rewrite
    

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

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

    Перезапустить Apache:

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

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

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

  • изменено httpd.conf

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

    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]
    

Ответ 7

<IfModule rewrite_module>
RewriteEngine on
RewriteBase /

# Removes the "/" at the end
RewriteRule (.+)/$ /$1 [L,R]

RewriteCond $1 !^(index\.php|dhtml|img|css|js|favicon\.ico|robots\.txt)
RewriteRule ^([^?&]+) /index.php/$1 [L]
</IfModule>

Ответ 8

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

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

Ответ 9

Попробуйте это, он работает perfetct

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]