Назад | Перейти на главную страницу

Динамическая подпапка Nginx как fastcgi_param

У меня есть сайт PHP, обслуживаемый Nginx. Я хочу иметь к нему доступ через разные подпапки. По сути, пользователь может зарегистрироваться, и когда они это сделают, они выбирают установить «URL-адрес». Исходя из этого, они будут заходить на сайт следующим образом:

example.com/{url}

Я бы также согласился с чем-то вроде:

example.com/s/{url}

если это поможет в его обнаружении.

Я хочу, чтобы Nginx получил этот URL-адрес и передал его PHP с помощью fastcgi_param. Кроме того, я хочу, чтобы PHP вел себя так, как будто доступ к сайту осуществляется через example.com. Так, например, example.com/s/{url}/about будет таким же, как example.com/about.

Если я правильно понял ваш вопрос, вы хотите удалить первую часть компонента пути URL-адреса сайта из URL-адреса, переданного в PHP. Вот как это можно сделать:

location ~ ^(?<userurl>[^/]+)(<dest>/.+)$ {
    rewrite ^ $dest break;
}

Итак, это изменит URL-адреса следующим образом:

http://example.com/about/something становится http://example.com/something.

http://example.com/about становится http://example.com/

Регулярное выражение также захватывает часть после первого / к переменной $userurl, который вы можете использовать в своем fastcgi_param для передачи части URL-адреса в сценарий PHP.

Однако вместо того, чтобы разделять работу между nginx и вашим PHP-скриптом, я рекомендую реализовать шаблон фронт-контроллера в вашем PHP-скрипте. Это означает, что он проанализирует $_SERVER['REQUEST_URI'] и обработайте запрос в соответствии с правилами, которые вы реализуете в PHP.

Затем в nginx вы просто добавляете:

try_files $uri $uri/ /index.php;

в разделе виртуального хоста для обработки запросов.