Catch-all должен передать путь к index.php в nginx - PullRequest
1 голос
/ 25 апреля 2019

В apache У меня есть .htaccess, который будет перезаписывать с http://server/api/any/path/i/want до http://server/api/index.php, если файл или папка не найдены.

Options -MultiViews

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond $0#%{REQUEST_URI} ([^#]*)#(.*)\1$
    RewriteRule ^.*$ %2index.php [L,NC,QSA]
</IfModule>

Я перехожу на docker ивместо этого я буду использовать nginx, и я хочу переписать rewrite.

Важно отметить, что использование apache и .htaccess $_SERVER['REQUEST_URI'] означает /api/any/path/i/want, а не переписаноurl (index.php....).

Я не очень хорошо разбираюсь в nginx, но из постов на SO я кое-что понял.

Соответствующий раздел site.conf

location / {
    root /app/html;
    try_files $uri $uri/ index.html /index.php?$args;
}

location ~ \.php$ {
    try_files $uri @missing;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
}

location @missing {
    rewrite ^ $scheme://$host/api/index.php permanent;
}

Приведенный выше конфиг, к сожалению, будет перенаправлен только на index.php, и это то, что мне удалось получить.

Как я могу сделать то же самое в nginx?

1 Ответ

3 голосов
/ 25 апреля 2019

Это типичная конфигурация nginx для PHP-FPM.

server {

 root /app/html;

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

  location ~ \.php$ {

    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
   }

} 

Обратите внимание на отличия от вашего примера:

  1. Удален ненужный блок @missing.
  2. Удален оператор try_files из блока местоположения .php.
  3. Перемещено объявление root в блок сервера. Если вам нужны разные корни, укажите это в своем вопросе.
  4. Единственное утверждение try_files включает полный путь для вашего api/index.php.

Если запрос приходит по несуществующему пути, он будет обрабатываться вашим /app/html/api/index.php сценарием, действующим как глобальная точка входа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...