Рейтинг:0

Расширение nginx 404 .php с fpm

флаг eg

Когда я посещаю несуществующий URL-адрес с расширением .php, я получаю страницу с ошибкой ngnix 404, однако URL-адрес без расширения .php работает, как и ожидалось, с использованием файла try_files. Где 404 обрабатывается через приложение php.

Это произошло с тех пор, как я добавил этот код как предложенный

fastcgi_split_path_info ^(.+?\.php)(/.*)$;
если (!-f $document_root$fastcgi_script_name) {
    вернуть 404;
}

Причиной добавления этого было исправление ошибки в журналах: FastCGI отправил в stderr: «Первичный сценарий неизвестен» при чтении заголовка ответа из восходящего потока. Эта ошибка происходила, когда я посещал файл non-existent.php. Я прочитал много сообщений о проблеме, связанной с отсутствием «SCRIPT_FILENAME», но для меня это было не так.

пример.conf

сервер {
  слушать 443 ssl;
  слушать [::]:443 ssl;

  имя_сервера пример.com;

  корень /var/www/example/public/public;

  журнал_доступа /var/log/nginx/example.access.log main_ext;
  error_log /var/log/nginx/example.error.log предупреждение;

  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  включить /etc/nginx/include.d/ssl.conf;

  # Ларавель
  переписать ^/index.php/(.*) /$1 навсегда;
    
  местоположение = / {
    try_files /page-cache/pc__index__pc.html /index.php?$query_string;
  }

  место расположения / {
    try_files $uri $uri/ /page-cache/$uri.html /index.php?$query_string;
  }

  расположение ~ [^/]\.php(/|$) {
    включить /etc/nginx/include.d/php.conf;
    fastcgi_pass unix:/var/run/php/php8.0-fpm-example.sock;
  }
}

php.conf

# Проверяем наличие файла
try_files $uri = 404;

# https://www.nginx.com/nginx-wiki/build/dirhtml/start/topics/examples/phpfcgi/
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
если (!-f $document_root$fastcgi_script_name) {
    вернуть 404;
}

fastcgi_index index.php;

# Смягчить https://httpoxy.org/ уязвимости
fastcgi_param HTTP_PROXY "";

fastcgi_intercept_errors выключен;

# включить параметр fastcgi_param
включить fastcgi_params;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Пример URL: https://example.com/foo - Работает нормально, показывает довольно 404 внутри php-приложения. https://example.com/foo.php - Показывает ngnix 404 по умолчанию.

vautee avatar
флаг kr
Не могли бы вы добавить эти примеры URL-адресов, которые работают / не будут работать, к вашему вопросу?
флаг eg
Конечно, я добавил их.
Рейтинг:1
флаг gr

Если вы хотите, чтобы эти URI обрабатывались как любые другие несуществующие URI, измените try_files $uri = 404; к try_files $uri /index.php?$query_string; в вашей php.conf файл.


Если ваше PHP-приложение действительно использует PATH_INFO переменную FastCGI (в чем я сомневаюсь), вы должны использовать

fastcgi_split_path_info ^(.+\.php)(/.+)$;

try_files $fastcgi_script_name /index.php?$query_string;

установить $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

(видеть это билет nginx trac).

флаг eg
Мне нужно было удалить оператор if, чтобы вернуть 404, но на самом деле он больше не нужен. Но это имеет смысл, теперь ура.
Ivan Shatsky avatar
флаг gr
Я собирался упомянуть, что `if { ... }` больше не нужен при написании ответа, но забудьте об этом. Впрочем, вы сами догадались :)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.