Nginx выдает ошибку 404 при попытке доступа к контроллеру CodeIgniter (PHP)

Вопрос или проблема

Я пытаюсь использовать 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:

  1. Настройка конфигурации 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 обрабатывать маршрутизацию.

  2. Проверка прав доступа

    Убедитесь, что у 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
  3. Перезапуск Nginx

    После внесения изменений в конфигурацию необходимо перезапустить Nginx для применения новых настроек:

    sudo systemctl restart nginx
  4. Проверка файла .htaccess (если используется)

    Поскольку вы настроены на использование Nginx, файл .htaccess не будет иметь значения, но убедитесь, что в CodeIgniter задан правильный индексный файл в config/config.php:

    $config['index_page'] = '';  // Убедитесь, что это поле пустое
  5. Проверка конфигурации CodeIgniter

    Убедитесь, что ваш $config['base_url'] настроен правильно в файле application/config/config.php. Он должен быть:

    $config['base_url'] = 'http://localhost/CodeIgniter-3.0.0/';
  6. Тестирование

    После выполнения этих шагов протестируйте доступ к различным контроллерам. Попробуйте обратиться к 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) для получения дополнительной информации.

Оцените материал
Добавить комментарий

Капча загружается...