Вопрос или проблема
У меня есть следующий код, я пробовал много раз, работал над ним 3 дня, но все еще ничего. Если я исправляю одну вещь, другая ломается – ищу помощь.
Что я пытаюсь добиться:
example.com
перенаправляется наwww.example.com
www.example.com/index
перенаправляется наwww.example.com/
www.example.com/page.php
перенаправляется наwww.example.com/page
(без .php)www.example.com/resources
должен работать, если у меня есть такая же папка и имя файлаwww.example.com/sdfgdsgdfsgjdf
показывает404.html
, потому что файл не существует- Параметры в URL работают, например
?lang=en&test=test
www.example.com//
должен иметь отключенный двойной слэш
В настоящее время этот код работает, кроме пункта 5. Каждая несуществующая страница показывает страницу индекса.
Я почти исправил все вышеперечисленное, заменив try_files $uri /index.php$is_args$args;
на try_files $fastcgi_script_name =404;
, но тогда страница www.example.com
не работает, только www.example.com/index
работает
server {
listen 80;
server_name example.com;
return 301 https://www.example.com/$request_uri;
}
server {
listen 80;
server_name www.example.com;
root /var/www/html;
index index.html index.php;
error_page 404 /404.html;
error_page 500 502 503 504 /404.html;
location / {
try_files $uri $uri.html @extensionless-php;
}
location ~ \.php$ {
try_files $uri /index.php$is_args$args;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_send_timeout 180s;
fastcgi_read_timeout 180s;
}
location @extensionless-php {
rewrite ^(.*)$ $1.php last;
}
location = /404.html {
internal;
}
}
server {
listen 80 default_server;
server_name _;
root /var/www/html/health-check;
location / {
index index.php index.html index.htm;
try_files $uri $uri.html =404;
}
}
Пока я пробовал множество попыток исправить это в разном порядке:
# rewrite ^/$ /index;
# rewrite ^/(.*)/$ /$1 permanent;
# rewrite ^(.+)/+$ $1 permanent;
# rewrite ^(.+)/index.html$ $1 permanent;
# rewrite ^/$ /index;
# Ошибка слишком многих перенаправлений
# location = /index.php {
# return 301 /;
# }
# try_files $uri /index.php;
# try_files $uri =404;
# try_files $uri /index.php?$args;
# try_files $uri /index.php?$args =404;
# try_files $uri $uri/ @extensionless-php;
# try_files $uri $uri.html @extensionless-php;
# try_files $uri $uri/ /index.php?$args @extensionless-php;
# Ломает папки и одинаковые имена файлов
# try_files $uri $uri/ /index.php$is_args$args;
# Показывает 404 на странице индекса, когда ? в URL
# try_files $uri /index.php$is_args$args =404;
# Все работает, кроме индекса
# try_files $fastcgi_script_name =404;
# Ломает URL
# fastcgi_param PATH_INFO $fastcgi_path_info;
Ответ или решение
Решение проблемы с отображением страницы index.php в NGINX
Проблема с тем, что страница index.php
не отображается должным образом, может вызывать не только неудобства, но и негативно сказываться на пользовательском опыте и SEO вашего веб-сайта. В данной статье мы рассмотрим настройки NGINX и предоставим решение вашей проблемы, основываясь на описанных вами требованиях.
Контекст проблемы
Ваша текущая конфигурация NGINX работает почти полностью, за исключением одного критически важного аспекта: страница index.php
всегда отображает индексную страницу вместо 404 ошибки, когда такой страницы нет. Вы также упомянули, что различные попытки исправления выявляют и другие проблемы, такие как отказ в редиректе или неправильная работа с URL.
Основные шаги для решения проблемы:
- Правильные настройки редиректов.
- Устранение некорректной обработки
404
ошибок. - Проверка правильной работы PHP.
Рекомендованная конфигурация NGINX
Ваш код NGINX можно улучшить, изменив порядок обработки запросов и используя правильные параметры. Вот измененный вариант конфигурации:
server {
listen 80;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 80;
server_name www.example.com;
root /var/www/html;
index index.php index.html;
error_page 404 /404.html;
error_page 500 502 503 504 /404.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
try_files $uri =404; # Если файл не найден, возвращаем 404
}
location @extensionless-php {
rewrite ^/(.*)$ /$1.php last;
}
location = /404.html {
internal;
}
}
server {
listen 80 default_server;
server_name _;
root /var/www/html/health-check;
location / {
try_files $uri =404;
}
}
Подробный анализ изменений:
-
Порядок обработки файлов:
- В блоке
location /
добавлен редирект кindex.php
, если файл или директорий не найден. Это позволит корректно обрабатывать основные запросы к вашему сайту. - Убрано использование
@extensionless-php
для основной конфигурации, так как это может привести к нежелательным результатам, если запрашивается несуществующий файл.
- В блоке
-
Корректная обработка ошибок:
- В конфигурации для обработки PHP добавлена строчка
try_files $uri =404;
. Это обеспечит возврат ошибки 404, когда запрашиваемый файл не существует, вместо перенаправления наindex.php
.
- В конфигурации для обработки PHP добавлена строчка
-
PHP обработчик:
- Используется директива
include snippets/fastcgi-php.conf;
для упрощения конфигурации PHP. Убедитесь, что у вас есть соответствующий файл, который настраивает параметры FastCGI. В большинстве случаев, он уже настроен и включает нужные параметры.
- Используется директива
Проверка работоспособности изменений
После внесения изменений в конфигурацию NGINX, выполните следующие шаги:
-
Проверьте корректность конфигурации:
sudo nginx -t
-
Перезапустите NGINX:
sudo systemctl restart nginx
-
Тестируйте все сценарии:
- Перейдите на
www.example.com
, должен отображатьсяindex.php
. - Перейдите на
www.example.com/page.php
, он должен перенаправить наwww.example.com/page
. - Попробуйте зайти на несуществующие страницы и убедитесь, что вы получаете
404.html
.
- Перейдите на
Заключение
Следуя представленной конфигурации, вы должны получить функциональный сайт, удовлетворяющий всем вашим требованиям. Корректная обработка запросов и ошибок поможет улучшить пользовательский опыт и повысить SEO вашего веб-приложения. Не забывайте тестировать каждое изменение и сохранять резервные копии вашей конфигурации перед её изменением.