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

Как обработать красивый URL-адрес в nginx, который не вызывает index.php из корневой папки?

Итак, если бы мы сделали следующее в блоке location файла nginx.conf:

try_files $uri $uri/ /index.php?$args;

Это вызывает файл index.php из корневой папки веб-сервера, если мы сделали что-то вроде https://www.example.com/john.

Как бы мы это записали, чтобы вызываемый им файл index.php находился в родительской папке?

Например: https://www.example.com/thisparent/john

Это будет использовать файл index.php из этого места: https://www.example.com/thisparent/

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

Для внутреннего перенаправления пути URI /parent/child к /parent/index.php, вам нужно вычислить путь к родительскому каталогу /parent, поскольку nginx не предоставляет переменную для родительского каталога.

Например, вы можете использовать:

location ~ \.php$ {
    # PHP FASTCGI configuration
}
# Matches are eager, so the first group matches everything
# up to the last '/'. We capture it into the $parent named variable.
location ~ ^(?<parent>.*)/ {
    try_files $uri $parent/index.php$is_args$args;
}

Регулярное выражение в последнем месте соответствует всем возможным путям URI, поэтому оно должно быть последним в server блок и будет иметь приоритет над всеми обычными префиксами (кроме ^~ и точное местоположение).

Менее агрессивное решение - использовать именованное местоположение в качестве запасного варианта. try_files директива:

location / {
    try_files $uri @parent_index;
}

location ~ \.php$ {
    # PHP FASTCGI configuration
}

location @parent_index {
    rewrite ^(?<parent>.*)/ $parent/index.php;
}