Вопрос или проблема
Я пытаюсь использовать CodeIgniter с Nginx. Я на этапе разработки, поэтому работаю на localhost. Это мой файл /etc/nginx/sites-available/default:
# Вы можете добавить сюда ваши
# server {
# ...
# }
# инструкции для каждого из ваших виртуальных хостов в этот файл
##
# Вам следует ознакомиться со следующими URL, чтобы получить основное представление
# о конфигурационных файлах Nginx и полностью раскрыть мощь Nginx.
# http://wiki.nginx.org/Pitfalls
# http://wiki.nginx.org/QuickStart
# http://wiki.nginx.org/Configuration
#
# Обычно вы захотите переместить этот файл в другое место и начать с чистого
# файла, но оставьте его для справки. Или просто отключите в sites-enabled.
#
# Пожалуйста, посмотрите /usr/share/doc/nginx-doc/examples/ для более подробных примеров.
##
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.php index.html index.htm;
# Сделайте сайт доступным по http://localhost/
server_name localhost;
location / {
# Сначала пытаемся обслужить запрос как файл, затем
# как директорию, затем возвращаем 404.
# try_files $uri $uri/ =404; это по умолчанию!
try_files $uri $uri/ /index.php;
# Раскомментируйте, чтобы включить naxsi для этого местоположения
# include /etc/nginx/naxsi.rules
}
error_page 404 /404.html;
# перенаправьте страницы ошибок сервера на статическую страницу /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# передадим PHP-скрипты серверу FastCGI, слушающему на 127.0.0.1:9000
#
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}
# fastcgi_split_path_info ^(.+\.php)(/.+)$;
# # ПРИМЕЧАНИЕ: У вас должно быть "cgi.fix_pathinfo = 0;" в php.ini
#
# # С php5-cgi по отдельности:
# fastcgi_pass 127.0.0.1:9000;
# # С php5-fpm:
# fastcgi_pass unix:/var/run/php5-fpm.sock;
# fastcgi_index index.php;
# include fastcgi_params;
#}
# запретить доступ к файлам .htaccess, если корень документа Apache
# совпадает с nginx
#
#location ~ /\.ht {
# deny all;
#}
}
# другой виртуальный хост с использованием смеси IP-, именнных и портовых настроек
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# root html;
# index index.html index.htm;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}
# HTTPS сервер
#
#server {
# listen 443;
# server_name localhost;
#
# root html;
# index index.html index.htm;
#
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
#
# ssl_session_timeout 5m;
#
# ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
# ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
# ssl_prefer_server_ciphers on;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}
Я следую уроку здесь: http://www.codeigniter.com/user_guide/tutorial/static_pages.html
Это файл config.php CodeIgniter:
<?php
defined('BASEPATH') OR exit('Нет прямого доступа к скрипту');
/*
|--------------------------------------------------------------------------
| Основной URL сайта
|--------------------------------------------------------------------------
|
| URL к корню вашего CodeIgniter. Обычно это будет ваш основной URL,
| С ПОСЛЕДНИМ слэшем:
|
| http://example.com/
|
| Если это не задано, то CodeIgniter попытается угадать протокол, домен
| и путь к вашей установке. Тем не менее, вы всегда должны настраивать это
| явно и никогда не полагаться на автоматическое угадывание, особенно в производственной
| среде.
|
*/
$config['base_url'] = 'http://localhost/CodeIgniter-3.0.0/';
/*
|--------------------------------------------------------------------------
| Индексный файл
|--------------------------------------------------------------------------
|
| Обычно это будет ваш файл index.php, если вы не переименовали его во что-то другое.
| Если вы используете mod_rewrite, чтобы удалить страницу, установите эту
| переменную так, чтобы она была пустой.
|
*/
$config['index_page'] = '';
/*
|--------------------------------------------------------------------------
| Протокол URI
|--------------------------------------------------------------------------
|
| Этот элемент определяет, какой глобальный сервер следует использовать для получения
| строки URI. Настройка по умолчанию 'REQUEST_URI' работает для большинства серверов.
| Если ваши ссылки, похоже, не работают, попробуйте один из других вкуснейших вариантов:
|
| 'REQUEST_URI' Использует $_SERVER['REQUEST_URI']
| 'QUERY_STRING' Использует $_SERVER['QUERY_STRING']
| 'PATH_INFO' Использует $_SERVER['PATH_INFO']
|
| ПРЕДУПРЕЖДЕНИЕ: Если вы установите это на 'PATH_INFO', URI всегда будут декодироваться!
*/
$config['uri_protocol'] = 'REQUEST_URI';
/*
|--------------------------------------------------------------------------
| Суффикс URL
|--------------------------------------------------------------------------
|
| Эта опция позволяет вам добавить суффикс ко всем URL-адресам, создаваемым CodeIgniter.
| Для получения дополнительной информации, пожалуйста, смотрите руководство пользователя:
|
| http://codeigniter.com/user_guide/general/urls.html
*/
$config['url_suffix'] = '';
/*
|--------------------------------------------------------------------------
| Язык по умолчанию
|--------------------------------------------------------------------------
|
| Это определяет, какой набор языковых файлов должен использоваться. Убедитесь,
| что существует доступный перевод, если вы собираетесь использовать что-то другое,
| кроме английского.
|
*/
$config['language'] = 'english';
/*
|--------------------------------------------------------------------------
| Кодировка по умолчанию
|--------------------------------------------------------------------------
|
| Это определяет, какая кодировка используется по умолчанию в различных методах,
| которые требуют предоставления кодировки.
|
| Смотрите http://php.net/htmlspecialchars для списка поддерживаемых кодировок.
|
*/
$config['charset'] = 'UTF-8';
/*
|--------------------------------------------------------------------------
| Включить/Отключить системные хуки
|--------------------------------------------------------------------------
|
| Если вы хотите использовать функцию 'hooks', вы должны включить ее, установив эту переменную на TRUE (логическое значение). См. руководство пользователя для получения подробной информации.
|
*/
$config['enable_hooks'] = FALSE;
/*
|--------------------------------------------------------------------------
| Префикс расширения класса
|--------------------------------------------------------------------------
|
| Этот элемент позволяет вам установить префикс имени файла/имени класса при расширении
| встроенных библиотек. Для получения дополнительной информации, пожалуйста, смотрите руководство пользователя:
|
| http://codeigniter.com/user_guide/general/core_classes.html
| http://codeigniter.com/user_guide/general/creating_libraries.html
|
*/
$config['subclass_prefix'] = 'MY_';
/*
|--------------------------------------------------------------------------
| Авозагрузка Composer
|--------------------------------------------------------------------------
|
| Включение этой настройки сообщит CodeIgniter искать скрипт автозагрузки пакета Composer в application/vendor/autoload.php.
|
| $config['composer_autoload'] = TRUE;
|
| Или, если у вас есть ваша директория vendor/ расположена где-то еще, вы
| можете также установить конкретный путь:
|
| $config['composer_autoload'] = '/path/to/vendor/autoload.php';
|
| Для получения дополнительной информации о Composer, пожалуйста, посетите http://getcomposer.org/
|
| Примечание: Это не отключит и не переопределит специфическую для CodeIgniter
| автозагрузку (application/config/autoload.php)
*/
$config['composer_autoload'] = FALSE;
/*
|--------------------------------------------------------------------------
| Разрешенные символы URL
|--------------------------------------------------------------------------
|
| Это позволяет вам указать, какие символы разрешены в ваших URL.
| Когда кто-то пытается отправить URL с недопустимыми символами, они получат
| сообщение о предупреждении.
|
| В качестве меры безопасности вам СИЛЬНО рекомендуется ограничить URL
| так мало символов, как возможно. По умолчанию разрешены только эти: a-z 0-9~%.:_-
|
| Оставьте пустым, чтобы разрешить все символы -- но только если вы безумны.
|
| Настроенное значение на самом деле является регулярным выражением символов
| и будет выполняться как: ! preg_match('/^[<permitted_uri_chars>]+$/i
|
| НЕ ИЗМЕНЯЙТЕ ЭТО, ЕСЛИ ВЫ ПОЛНОСТЬЮ НЕ ПОНИМАЕТЕ ПОСЛЕДСТВИЯ!!
|
*/
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
/*
|--------------------------------------------------------------------------
| Включить строковые запросы
|--------------------------------------------------------------------------
|
| По умолчанию CodeIgniter использует URL на основе сегментов, удобные для поисковых систем:
| example.com/who/what/where/
|
| По умолчанию CodeIgniter включает доступ к массиву $_GET. Если по какой-то причине
| вы хотите отключить его, установите 'allow_get_array' на FALSE.
|
| Вы также можете по желанию включить стандартные URL на основе строки запроса:
| example.com?who=me&what=something&where=here
|
| Опции: TRUE или FALSE (логическое значение)
|
| Остальные элементы позволяют вам установить "слова" строк запроса, которые вызовут ваши контроллеры и их функции:
| example.com/index.php?c=controller&m=function
|
| Пожалуйста, обращайте внимание на то, что некоторые помощники могут не работать как ожидалось, когда
| эта функция включена, поскольку CodeIgniter изначально предназначен для
| использования URL на основе сегментов.
|
*/
$config['allow_get_array'] = TRUE;
$config['enable_query_strings'] = FALSE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';
$config['directory_trigger'] = 'd';
/*
|--------------------------------------------------------------------------
| Порог записи ошибок
|--------------------------------------------------------------------------
|
| Если вы включили запись ошибок, вы можете установить порог ошибки для
| определения того, что будет записываться. Опции порога:
| Вы можете включить запись ошибок, установив порог выше нуля. Порог определяет, что будет записываться. Опции порога:
|
| 0 = Отключает запись, запись ошибок ВЫКЛ
| 1 = Сообщения об ошибках (включая ошибки PHP)
| 2 = Сообщения отладки
| 3 = Информационные сообщения
| 4 = Все сообщения
|
| Вы также можете передать массив с уровнями порога, чтобы показать отдельные типы ошибок
|
| array(2) = Сообщения отладки, без сообщений об ошибках
|
| Для живого сайта, как правило, вы будете включать только ошибки (1), иначе
| ваши журналы заполнятся очень быстро.
|
*/
$config['log_threshold'] = 0;
/*
|--------------------------------------------------------------------------
| Путь к директории записи ошибок
|--------------------------------------------------------------------------
|
| Оставьте ЭТО ПУСТЫМ, если вы не хотите установить что-то другое, кроме
| стандартного каталога приложения/logs/. Используйте полный серверный путь с завершающим слэшем.
|
*/
$config['log_path'] = '';
/*
|--------------------------------------------------------------------------
| Расширение файла журнала
|--------------------------------------------------------------------------
|
| Расширение имени файла по умолчанию для файлов журнала. По умолчанию 'php' позволяет
| защищать файлы журнала с помощью базового скриптинга, когда они хранятся
| в общедоступной директории.
|
| Примечание: Оставляя его пустым, вы получите 'php' по умолчанию.
|
*/
$config['log_file_extension'] = '';
/*
|--------------------------------------------------------------------------
| Параметры файлов журнала
|--------------------------------------------------------------------------
|
| Параметры файловой системы, которые будут применены к вновь созданным файлам журнала.
|
| ВАЖНО: Это ДОЛЖНО быть целым числом (без кавычек), и вы ДОЛЖНЫ использовать восемнадцатеричное
| целочисленное обозначение (т.е. 0700, 0644 и т.д.)
*/
$config['log_file_permissions'] = 0644;
/*
|--------------------------------------------------------------------------
| Формат даты для журналов
|--------------------------------------------------------------------------
|
| Каждый элемент, который записывается, имеет связанную дату. Вы можете использовать коды даты PHP
| для настройки вашего собственного формата даты.
|
*/
$config['log_date_format'] = 'Y-m-d H:i:s';
/*
|--------------------------------------------------------------------------
| Путь к директории представлений ошибок
|--------------------------------------------------------------------------
|
| Оставьте ЭТО ПУСТЫМ, если вы не хотите установить что-то другое, кроме
| стандартного каталога приложения/views/errors/. Используйте полный серверный путь с завершающим слэшем.
|
*/
$config['error_views_path'] = '';
/*
|--------------------------------------------------------------------------
| Путь к директории кэша
|--------------------------------------------------------------------------
|
| Оставьте ЭТО ПУСТЫМ, если вы не хотите установить что-то другое, кроме
| стандартного каталога приложения/cache/. Используйте полный серверный путь с завершающим слэшем.
|
*/
$config['cache_path'] = '';
/*
|--------------------------------------------------------------------------
| Включить запросы кэша по строке
|--------------------------------------------------------------------------
|
| Установите это в TRUE, если вы хотите использовать разные файлы кэша в зависимости от
| строки запроса URL. Пожалуйста, будьте внимательны, это может привести к многочисленным файлам кэша.
|
*/
$config['cache_query_string'] = FALSE;
/*
|--------------------------------------------------------------------------
| Ключ шифрования
|--------------------------------------------------------------------------
|
| Если вы используете класс шифрования, вы должны установить ключ шифрования.
| См. руководство пользователя для получения дополнительной информации.
|
| http://codeigniter.com/user_guide/libraries/encryption.html
|
*/
$config['encryption_key'] = '';
/*
|--------------------------------------------------------------------------
| Переменные сессии
|--------------------------------------------------------------------------
|
| 'sess_driver'
|
| Драйвер хранения, который следует использовать: файлы, база данных, redis, memcached
|
| 'sess_cookie_name'
|
| Имя куки сессии, должно содержать только символы [0-9a-z_-]
|
| 'sess_expiration'
|
| Количество СЕКУНД, в течение которых вы хотите, чтобы сессия продлилась.
| Установка на 0 (ноль) означает истечение, когда браузер закрыт.
|
| 'sess_save_path'
|
| Место для сохранения сессий, в зависимости от драйвера.
|
| Для драйвера 'files' это путь к записываемой директории.
| ПРЕДУПРЕЖДЕНИЕ: Поддерживаются только абсолютные пути!
|
| Для драйвера 'database' это имя таблицы.
| Пожалуйста, ознакомьтесь с документацией по формату для других драйверов сессий.
|
| ВАЖНО: Вы ОБЯЗАНЫ установить действительный путь сохранения!
|
| 'sess_match_ip'
|
| Определяет, следует ли сравнивать IP-адрес пользователя при чтении данных сессии.
|
| 'sess_time_to_update'
|
| Сколько секунд между CI регенерирует идентификатор сессии.
|
| 'sess_regenerate_destroy'
|
| Следует ли уничтожить данные сессии, связанные со старым идентификатором сессии
| при автоматической регенерации идентификатора сессии. Когда установлено на FALSE, данные
| будут позже удалены сборщиком мусора.
|
| Другие настройки кук сессии совместимы с остальной частью приложения,
| за исключением 'cookie_prefix' и 'cookie_httponly', которые игнорируются здесь.
|
*/
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
/*
|--------------------------------------------------------------------------
| Параметры куки
|--------------------------------------------------------------------------
|
| 'cookie_prefix' = Установите префикс имени куки, если вам нужно избежать конфликтов
| 'cookie_domain' = Установите на .your-domain.com для куков на сайте
| 'cookie_path' = Обычно будет прямым слэшем
| 'cookie_secure' = Кука будет установлена только в том случае, если существует безопасное соединение HTTPS.
| 'cookie_httponly' = Кука будет доступна только через HTTP(S) (без javascript)
|
| Примечание: Эти параметры (за исключением 'cookie_prefix' и
| 'cookie_httponly') также повлияют на сессии.
|
*/
$config['cookie_prefix'] = '';
$config['cookie_domain'] = '';
$config['cookie_path'] = "https://serverfault.com/";
$config['cookie_secure'] = FALSE;
$config['cookie_httponly'] = FALSE;
/*
|--------------------------------------------------------------------------
| Стандартизировать перенос строки
|--------------------------------------------------------------------------
|
| Определяет, следует ли стандартизировать символы переноса строки в входных данных,
| т.е. заменять вхождения \r\n, \r, \n на значение PHP_EOL.
|
| Это особенно полезно для переносимости между ОС на основе UNIX,
| (обычно \n) и Windows (\r\n).
|
*/
$config['standardize_newlines'] = FALSE;
/*
|--------------------------------------------------------------------------
| Глобальная фильтрация XSS
|--------------------------------------------------------------------------
|
| Определяет, всегда ли активен фильтр XSS, когда встречаются данные GET, POST или
| COOKIE
|
| ПРЕДУПРЕЖДЕНИЕ: Эта функция УСТАРЕЛА и в настоящее время доступна только
| для обратной совместимости!
|
*/
$config['global_xss_filtering'] = FALSE;
/*
|--------------------------------------------------------------------------
| Подделка межсайтовых запросов
|--------------------------------------------------------------------------
| Включает установку токена куки CSRF. Если установлено в TRUE, токен будет
| проверен на отправленной форме. Если вы принимаете данные от пользователей, настоятельно
| рекомендуется включить защиту CSRF.
|
| 'csrf_token_name' = Имя токена
| 'csrf_cookie_name' = Имя куки
| 'csrf_expire' = Число в секундах, через которое токен должен истечь.
| 'csrf_regenerate' = Регенерировать токен при каждом отправлении
| 'csrf_exclude_uris' = Массив URI, которые игнорируют проверки CSRF
*/
$config['csrf_protection'] = FALSE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();
/*
|--------------------------------------------------------------------------
| Сжатие вывода
|--------------------------------------------------------------------------
|
| Включает сжатие вывода Gzip для более быстрого загрузки страниц. Когда включено,
| класс вывода будет проверять, поддерживает ли ваш сервер Gzip.
| Даже если он поддерживает, однако, не все браузеры поддерживают сжатие,
| так что включайте только в том случае, если вы уверены, что ваши посетители могут справиться с этим.
|
| Используется только если zlib.output_compression выключена в вашем php.ini.
| Пожалуйста, не используйте его вместе с сжатием вывода на уровне httpd.
|
| ОЧЕНЬ ВАЖНО: Если вы получаете пустую страницу, когда сжатие включено,
| это значит, что вы преждевременно отправляете что-то в браузер. Это может быть
| даже строка пробела в конце одного из ваших скриптов. Для
| того чтобы сжатие работало, ничего не должно быть отправлено перед вызовом
| буфера вывода классом вывода. Не 'echo' никаких значений с включенным сжатием.
|
*/
$config['compress_output'] = FALSE;
/*
|--------------------------------------------------------------------------
| Главный временной эталон
|--------------------------------------------------------------------------
|
| Опции: 'local' или любой поддерживаемый PHP часовой пояс. Эта настройка сообщает
| системе, следует ли использовать местное время вашего сервера в качестве главного 'сейчас'
| эталон, или преобразовать его в сконфигурированный часовой пояс. См. страницу 'date
| helper' руководства пользователя для получения информации о обработке даты.
|
*/
$config['time_reference'] = 'local';
/*
|--------------------------------------------------------------------------
| Перезапись коротких тегов PHP
|--------------------------------------------------------------------------
|
| Если ваша установка PHP не имеет включенной поддержки коротких тегов, CI
| может перезаписать теги на лету, позволяя вам использовать этот синтаксис
| в ваших файлах представлений. Опции: TRUE или FALSE (логическое значение)
|
*/
$config['rewrite_short_tags'] = FALSE;
/*
|--------------------------------------------------------------------------
| IP-адреса обратного прокси
|--------------------------------------------------------------------------
|
| Если ваш сервер находится за обратным прокси, вы должны добавить в белый список IP
| адреса прокси, от которых CodeIgniter должен доверять заголовкам, таким как
| HTTP_X_FORWARDED_FOR и HTTP_CLIENT_IP, чтобы должным образом идентифицировать
| IP-адрес посетителя.
|
| Вы можете использовать как массив, так и список адресов прокси, разделенных запятыми,
| а также указание целых подсетей. Вот несколько примеров:
|
| Список, разделенный запятыми: '10.0.1.200,192.168.5.0/24'
| Массив: array('10.0.1.200', '192.168.5.0/24')
*/
$config['proxy_ips'] = '';
Когда я перехожу по следующему URL:
http://127.0.0.1/CodeIgniter-3.0.0/index.php
индексная страница загружается успешно. Однако, когда я перехожу по любому из следующих:
http://127.0.0.1/CodeIgniter-3.0.0/index.php/welcome
http://127.0.0.1/CodeIgniter-3.0.0/index.php/welcome/index
http://127.0.0.1/CodeIgniter-3.0.0/index.php/pages
http://127.0.0.1/CodeIgniter-3.0.0/index.php/pages/view
Nginx выдает ошибку 404. Мой контроллер Welcome.php является файлом по умолчанию:
<?php
defined('BASEPATH') OR exit('Нет прямого доступа к скрипту');
class Welcome extends CI_Controller {
/**
* Индексная страница для этого контроллера.
*
* Соответствует следующему URL
* http://example.com/index.php/welcome
* - или -
* http://example.com/index.php/welcome/index
* - или -
* Поскольку этот контроллер установлен в качестве контроллера по умолчанию в
* config/routes.php, он отображается по http://example.com/
*
* Таким образом, любые другие публичные методы, не начинающиеся с подчеркивания,
* будут соответствовать /index.php/welcome/<method_name>
* @see http://codeigniter.com/user_guide/general/urls.html
*/
public function index()
{
$this->load->view('welcome_message');
}
}
Как вы видите выше, Welcome.php говорит:
* Соответствует следующему URL
* http://example.com/index.php/welcome
* - или -
* http://example.com/index.php/welcome/index
но Nginx все равно выдает ошибку 404. Я первоначально опубликовал этот вопрос на StackOverflow: https://stackoverflow.com/questions/31932160/php-codeigniter-nginx-throws-404-and-ignores-class-and-method
но я заметил, что решение аналогичной проблемы было найдено на ServerFault: Codeigniter в подпапке на Nginx 404
поэтому я решил опубликовать это здесь тоже. Спасибо заранее за любую помощь.
Я думаю, вам следует иметь правило перезаписи для каждого контроллера, как сказано здесь: http://forum.codeigniter.com/archive/index.php?thread-25637.html
Например, если у вас есть контроллер входа:
rewrite ^/login(.*)? /index.php?/login$1 last;
Вы также можете обратиться к этому официальному сайту nginx, там есть два рецепта, которые работают хорошо: https://www.nginx.com/resources/wiki/start/topics/recipes/codeigniter/
Ответ или решение
Чтобы устранить ошибку 404, возникающую при попытке доступа к контроллерам CodeIgniter через Nginx, необходимо внести некоторые изменения в конфигурацию вашего Nginx-сервера. Ошибка 404 может возникать потому, что Nginx не знает, как правильно обрабатывать URL-адреса, которые не совпадают с существующими файлами или директориями.
Следуйте указанным ниже шагам, чтобы правильно настроить Nginx для работы с CodeIgniter:
-
Настройка конфигурации Nginx
Обновите ваш файл конфигурации Nginx (например,
/etc/nginx/sites-available/default
). Ниже приведен пример конфигурации, которая включает необходимые директивы, чтобы CodeIgniter корректно работал с "чистыми" URL.server { listen 80; server_name localhost; root /path/to/your/CodeIgniter-3.0.0; # Укажите путь к корневой директории вашего проекта index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; # Перенаправление всех запросов к index.php } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # Убедитесь, что у вас правильный путь к php-fpm fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; }
Обратите внимание на изменения в блоке
location /
. Использование$query_string
обеспечивает передачу параметров запроса кindex.php
, что позволяет CodeIgniter обрабатывать маршрутизацию. -
Проверка прав доступа
Убедитесь, что у Nginx есть права на чтение файлов в каталоге вашего проекта. Проверьте права доступа к проекту и обновите их при необходимости:
sudo chown -R www-data:www-data /path/to/your/CodeIgniter-3.0.0 sudo chmod -R 755 /path/to/your/CodeIgniter-3.0.0
-
Перезапуск Nginx
После внесения изменений в конфигурацию необходимо перезапустить Nginx для применения новых настроек:
sudo systemctl restart nginx
-
Проверка файла .htaccess (если используется)
Поскольку вы настроены на использование Nginx, файл
.htaccess
не будет иметь значения, но убедитесь, что в CodeIgniter задан правильный индексный файл вconfig/config.php
:$config['index_page'] = ''; // Убедитесь, что это поле пустое
-
Проверка конфигурации CodeIgniter
Убедитесь, что ваш
$config['base_url']
настроен правильно в файлеapplication/config/config.php
. Он должен быть:$config['base_url'] = 'http://localhost/CodeIgniter-3.0.0/';
-
Тестирование
После выполнения этих шагов протестируйте доступ к различным контроллерам. Попробуйте обратиться к URL-адресам, таким как:
http://127.0.0.1/CodeIgniter-3.0.0/welcome http://127.0.0.1/CodeIgniter-3.0.0/pages/view
Следуя этим рекомендациям, вы сможете устранить проблему с ошибкой 404 и ваш проект на CodeIgniter должен начать работать корректно под управлением Nginx. Если ошибка все еще возникает, проверьте логи ошибок Nginx (/var/log/nginx/error.log
) для получения дополнительной информации.