Nginx PHP-FPM с единственной точкой входа и PATH_INFO

Я пытаюсь настроить nginx с помощью php-fpm, чтобы большинство запросов передавалось одному php-скрипту.

Расположение каталогов такое как показано ниже:

assets/...
index.php

Я бы хотел, чтобы URL-адреса работали так:

/ -> index.php
/foo -> index.php
/bar/baz?spam=ham -> index.php
/assets -> assets folder

index.php должен иметь PATH_INFO , установленный на '/' , '/ foo ' и ' / bar / baz ' соответственно.

Ближайшая конфигурация, которую я выяснил, следующая:

location / {
    try_files $uri /index.php/$uri$is_args$args;
}

location /assets {
    try_files $uri =404;
}

location /index.php {
    include snippets/fastcgi-php.conf;
    include fastcgi_params;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
}

Однако PATH_INFO всегда имеет дополнительный / (например, '//' в первом случае). Переход на /index.php$url$is_args$args работает для всех случаев, кроме / , что приводит к 404.

Я, конечно, мог бы изменить сценарий, чтобы обработать лишние / , но он кажется немного грязным.

Я пытался найти и прочитать руководство, но не могу понять его, любой указатели?

1
задан 15 October 2016 в 17:04
1 ответ

Вы прокомментировали, что ваши фрагменты/fastcgi-php.conf содержат:

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

Который, как вы заметили, не соответствует URI /index.php/, что объясняет, почему вы получаете ответ 404.

Вы можете переопределить значение в фрагментах/fastcgi-php.conf, поместив после него исправленное утверждение (предполагая, что вы не хотите редактировать системный файл). Например:

location / {
    try_files $uri /index.php$uri$is_args$args;
}
location /index.php {
    include snippets/fastcgi-php.conf;
    include fastcgi_params;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
}

Просто поменяйте + на * так, чтобы / совпадали, когда за ними больше ничего не следует.

.
1
ответ дан 3 December 2019 в 23:39

Теги

Похожие вопросы