Вопрос или проблема
У меня есть небольшое приложение, которое я хотел бы разместить по каталогу на домене. В настоящее время оно работает нормально с использованием предоставленного по умолчанию файла slim, но я хотел бы добавить правило переписывания.
Правило переписывания, которое я хочу, состоит в том, чтобы принимались только URL-адреса, начинающиеся с /foobar/, при этом /foobar/ удаляется перед тем, как попасть в slim. Вот эквивалентное правило переписывания в моей конфигурации Apache, которое я ранее использовал и которое работало именно так, как мне нужно:
RewriteEngine On
RewriteRule ^/foobar(/.*) /foobar/public/index.php$1 [QSA,L]
Текущая работа с этим правилом переписывания заключается в том, что параметр $_SERVER[‘REQUEST_URI’] остается полным “http://localhost/foobar/test“, но путь (по которому Slim сопоставляет маршрут) — это просто “/test”, поэтому нам не нужно явно создавать группу маршрутов.
На данный момент моя конфигурация nginx выглядит так:
server {
listen 80;
server_name www.mysite.com mysite.com;
root /var/www/mysite/foobar/public;
# Это то, что я пытался добавить, но без успеха
rewrite ^/foobar(/.*) /index.php$1 break;
try_files $uri /index.php;
location /index.php {
fastcgi_connect_timeout 3s;
fastcgi_read_timeout 10s;
fastcgi_pass app:9000; # "app" — это контейнер Docker
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
Я пробовал различные правила в течение нескольких часов. Я не совсем уверен, что делаю неправильно, очевидно, я неправильно понимаю, как работает nginx, и я уверен, что эксперт в nginx уже знает правильный ответ. Если кто-то сможет предоставить информацию о том, где я ошибаюсь, я буду очень признателен!
Заранее спасибо!
Обновленная попытка:
server {
listen 80;
server_name www.mysite.com mysite.com;
root /var/www/mysite;
index index.php;
location ~ ^/foobar(/.*)$ {
root /var/www/mysite/foobar/public;
fastcgi_connect_timeout 3s;
fastcgi_read_timeout 10s;
fastcgi_pass app:9000;
include fastcgi_params;
fastcgi_param PATH_INFO $1;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
}
Вы правы, nginx имеет другую логику для перенаправлений.
Этот подход может работать для вас. Однако я не использовал nginx с программами, которые используют такие шаблоны, поэтому не уверен, сработает ли это. Также это может быть не оптимальный способ выполнения этого.
location ~ ^/foobar(/.*)$ {
fastcgi_connect_timeout 3s;
fastcgi_read_timeout 10s;
fastcgi_pass app:9000; # "app" — это контейнер Docker
include fastcgi_params;
fastcgi_param PATH_INFO $1;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
Ответ или решение
Чтобы настроить Nginx для удаления префикса /foobar/
из URI перед передачей запроса вашему приложению на Slim, вам потребуется правильно сконфигурировать файл конфигурации сервера. Вот как это можно сделать:
server {
listen 80;
server_name www.mysite.com mysite.com;
root /var/www/mysite; # Основная директория вашего приложения
# Обработчик для любого запроса с префиксом /foobar
location ~ ^/foobar(/.*)$ {
# Установка корня для доступа к файлам приложения Slim
alias /var/www/mysite/foobar/public; # Используем 'alias' для изменения точки доступа
try_files $uri /index.php?$query_string; # Пробуем найти файл, если не находим – переходим на index.php
# Настройка FastCGI
fastcgi_connect_timeout 3s;
fastcgi_read_timeout 10s;
fastcgi_pass app:9000; # Имя вашего Docker-контейнера
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename; # Полный путь к исполняемому файлу
fastcgi_param PATH_INFO $1; # Передаем оставшуюся часть URI
}
# Обработка запросов к index.php, если необходимо
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass app:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Объяснение конфигурации:
-
server: Определяет настройки для вашего виртуального хоста (серверного блока).
-
*location ~ ^/foobar(/.)$**: Этот блок отвечает за обработку всех запросов, начинающихся с
/foobar
. Регулярное выражение захватывает весь путь, который следует после/foobar
, и сохраняет его в$1
. -
alias: Используется для изменения корневой директории к
/var/www/mysite/foobar/public
, что позволяет Nginx найти нужные файлы, не меняя структуру URL. -
try_files: Попытка найти файл по указанному пути. Если файл не найден, управление передается
index.php
. При этом$query_string
гарантирует, что query-параметры сохранились. -
fastcgi_param: Передает необходимые параметры в FastCGI.
SCRIPT_FILENAME
указывает полный путь к запрашиваемому скрипту, аPATH_INFO
передает часть URI, которая идет после/foobar
.
Примечания:
- Проверьте, что конфигурация вашего контейнера со службой PHP-FPM (или другой FastCGI) настроена правильно и слушает на порту
9000
. - Не забудьте перезагрузить Nginx после внесения изменений в конфигурацию, чтобы они вступили в силу:
sudo systemctl reload nginx
.
Эта конфигурация позволит вам корректно обрабатывать запросы к приложению Slim с префиксом /foobar
, удаляя его перед передачей на обработку.