Как мне написать файл.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
и будет дан кодигнитору, но 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
это нарушало мои планы на величие.
Теперь это работает отлично. Все ответы здесь жизнеспособны и работают.
9 ответов
В вашем 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 вы должны иметь
- система /
- гид пользователя/
- index.php
- .htaccess
- license.txt
Кроме того, поскольку на вашем сервере запущено несколько сайтов, вам может потребоваться VirtualHosts. Добавьте это к последней части вашего apache2.conf
для каждого сайта, который у вас есть:
Listen *:11000
<VirtualHost *:11000>
ServerAdmin you@somewhere.com
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
,
Попробовал ответ здесь, но это не сработало для меня. Итак, я попробовал следующее, и это сделало...
создайте.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]
сделанный! попробуйте, и это обязательно сработает. Надеюсь, поможет
Были некоторые проблемы с поиском, где изменить "AllowOverRide All".
Из этого руководства я нашел файл (по умолчанию).
Удалить URL Index.php CodeIgniter в 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 исчезает
Попробуйте это, это работает безупречно
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]
Этот конкретный файл.htaccess выглядит так, как будто он должен идти в корне вашего сайта (имеется в виду текущий исполняемый сайт).
Посмотрите в документации дляRewriteCond
чтобы узнать, какие другие условия вы можете указать. В основном RewriteRule
будет применяться только если все его предшествующие RewriteCond
с совпадают. Вы можете попробовать добавить эти правила только для перенаправления, если запрошенный URL не существует:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
mod_rewrite очень мощный, но он может быть настоящей болью, если он не делает то, что, как вы думаете, должен. Я не знаю ни одного способа отладки его директив.
Что касается того, что еще можно сделать с файлом.htaccess, документы Apache для файлов htaccess всегда являются хорошим началом. Наиболее распространенное использование для проверки подлинности для каждого каталога. Большинство директив конфигурации сервера поддерживаются в файле.htaccess (при условии, что сервер AllowOverride так говорит), но некоторые имеют другой синтаксис.
У меня были те же проблемы с изображениями ссылок 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(корневой каталог сайта) и вставил следующее.
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]
Поместите это в корневой каталог вашего веб-сайта.
Если у вас есть несколько сайтов, поместите их в верхней части каждого такого сайта.
Если у вас несколько сайтов, запущенных из одного каталога, вы можете использовать RewriteCond для исключения или включения определенных сайтов в правило перезаписи.
Вы можете исключить определенные каталоги (например, / статьи) таким же образом.
RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico)
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
Простой в.htaccess на корневой папке! Работает для меня.
<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>