Cascade index.php в nginx "try_files" - PullRequest
       7

Cascade index.php в nginx "try_files"

0 голосов
/ 04 сентября 2018

В Apache можно перенаправить все в ближайший index.php, используя .htaccess

Пример структуры папок:

/Subdir
/index.php
/.htaccess   

/Subdir
/Subdir/.htaccess
/Subdir/index.php

Если я получу доступ к /something, он будет перенаправлен на корневой index.php, а если я получу доступ к /Subdir/something, он будет перенаправлен на Subdir/index.php

Можно ли это сделать и в nginx? Это должно быть возможно, потому что в документации по nginx написано If you need .htaccess, you’re probably doing it wrong:)

Я знаю, как перенаправить все в корневой index.php:

location / {
  try_files $uri $uri/ /index.php?$query_string;
}

Но как проверять index.php в каждом родительском каталоге до /?

редактирование:

Я обнаружил, что эти правила делают то, что я хочу:

location / {
  try_files $uri $uri/ /index.php?$query_string;
}

location /Subdir{
  try_files $uri $uri/ /Subdir/index.php?$query_string;
}

Но есть ли способ сделать его абстрактным, как

location /$anyfolder{
  try_files $uri $uri/ /$anyfolder/index.php?$query_string;
} 

1 Ответ

0 голосов
/ 07 сентября 2018

Директива index должна позаботиться о большей части этого

server {
    index index.php;
    ...
} 

Если ваша установка требует использования try_files, то это должно работать для вас:

location / {
    try_files $uri $uri/ $uri/index.php?$query_string =404;
}

Вы также можете захватить местоположение и использовать в качестве переменной:

location ~ ^/(?<anyfolder>) {
    # Variable $anyfolder is now available
    try_files $uri $uri/ /$anyfolder/index.php?$query_string =404;
}

Редактировать

Я вижу из вашего комментария, что вы хотите сначала попробовать файл index.php в папке темы и перейти к файлу в корневой папке, если его нет в папке темы.

Для этого вы можете попробовать что-то вроде ...

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

Примечание: $is_args$args лучше, чем ?$query_string, если есть вероятность, что аргументов может не быть.

Редактировать 2

Хорошо. Получил награду, но продолжал чувствовать, что я что-то упустил, и что ваш запрос фактически не был адресован. После прочтения и перечитывания, я думаю, что наконец понял ваш запрос.

Вы хотите проверить файл index.php в целевой папке. Если найдено, это будет выполнено. Если не найдено, продолжайте проверять родительские папки вверх по дереву каталогов, пока оно не будет найдено (это может быть корневая папка).

Ответ, который я дал в «РЕДАКТИРОВАНИИ» выше, просто переходит в корневую папку, но сначала вам нужно проверить промежуточные папки.

Не проверено, но вы можете попробовать рекурсивный шаблон регулярных выражений

# This will recursively swap the parent folder for "current"
# However will only work up to "/directChildOfRoot/grandChildOfRoot"
# So we will add another location block to continue to handle "direct child of root" and "root" folders
location ~ ^/(?<parent>.+)/(?<current>[^\/]+)/? {
    try_files /$current /$current/ /$current/index.php$is_args$args /$parent;
}

# This handles "direct child of root" and "root" folders
location / {
    try_files $uri $uri/ $uri/index.php$is_args$args /index.php$is_args$args;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...