Рейтинг:1

Nginx - изменение корневой папки для определенного URL-адреса дает ошибку 404

флаг us

Я пытаюсь организовать блокировку местоположения для всех, кто проходит mydomain.com/game/admin url, убедитесь, что сервер nginx для извлечения контента существует в /var/www/html/my-cakephp-приложение/ каталог. Мое приложение построено с использованием фреймворка cakephp, и его структура каталогов показана ниже:

  • /var/www/html/my-cakephp-приложение/
    • администратор
      • Конфигурация
      • Приставка
      • Контроллер
      • Вид
      • webroot (в этом каталоге существует файл index.php точки входа приложения)

Также у меня есть статический веб-сайт html/css, расположенный в /var/www/html каталог. Так что любой с мой домен.com URL также может видеть этот веб-сайт.

Вот мой текущий блок сервера nginx:

сервер {
    слушать 80;
    слушать [::]:80;

    корень /var/www/html;

    индекс index.html index.htm index.php;

    имя_сервера mydomain.com;

    место расположения / {
        try_files $uri $uri/ =404;
    }
    
    местоположение /игра/админ {
            вернуть 301 /игра/админ/;
    }

    местоположение /игра/админ/ {

                корень /var/www/html/my-cakephp-app/admin/webroot;
                try_files $uri $uri/ /game/admin/index.php$is_args$args;
  
                расположение ~* \.php(/|$) {
                  включить фрагменты/fastcgi-php.conf;
                  fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
               } 

    }

    расположение ~ \.php$ {
        включить фрагменты/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    местоположение ~ /\.ht {
        отрицать все;
    }
}

С этой настройкой мой статический веб-сайт работает нормально. Но приложение cakephp выдает ошибку 404 не найдено в браузере. Ошибок в nginx/error.log нет.

Но когда я запускаю конфигурацию nginx ниже, мое приложение работает нормально. Но мне нужно избавиться от моего сайта html/css. Я планирую обновить приложение html/css с помощью сайта wordpress. Поэтому у меня должна быть возможность запускать сайт WordPress в качестве родителя.

сервер {
    слушать 80;
    имя_сервера mydomain.com;
    корень /var/www/html/my-cakephp-app/admin/webroot;
    
    индекс index.html index.htm index.php;
 
    место расположения / {
        try_files $uri $uri/ /index.php$is_args$args;
        включен автоиндекс;
    }
    
    расположение ~ \.php$ {
        включить фрагменты/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
    
    местоположение ~ /\.ht {
        отрицать все;
    }
}

Я не мог придумать, что я сделал не так с первым блоком сервера. Любые предложения будут действительно полезны.

Рейтинг:1
флаг jp

Две основные проблемы:

  • внешний расположение ~ \.php$ Блок имеет приоритет над местоположение /игра/админ/ блокировать, если вы не используете ^~ модификатор (см. этот документ для подробностей)
  • в корень директива генерирует путь к файлу путем простой конкатенации, поэтому ожидается, что ваш контроллер будет расположен по адресу /var/www/html/my-cakephp-app/admin/webroot/game/admin/index.php (видеть этот документ для подробностей)

Один из вариантов — переместить проект так, чтобы структура каталогов соответствовала структуре URI. Это может быть достигнуто с помощью символической ссылки, которая указывает /var/www/html/игра/админ к /var/www/html/my-cakephp-app/admin/webroot в этом случае внешний расположение ~ \.php$ block сможет выполнять оба проекта.


Другим вариантом является псевдоним директива. Видеть этот документ для деталей.

расположение ^~ /game/admin {
    псевдоним /var/www/html/my-cakephp-app/admin/webroot;

    if (!-e $request_filename) { переписать ^ /game/admin/index.php last; }

    расположение ~ \.php$ {
        если (!-f $request_filename) { return 404; }

        включить фрагменты/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $request_filename;
    }
}

Обратите внимание, что $document_root$fastcgi_script_name не будет работать с псевдоним и что $request_filename вместо этого следует использовать.

я избегаю использования псевдоним и try_files вместе из-за Эта проблема. Видеть это предостережение об использовании если директива.

Madushan Perera avatar
флаг us
Ваше решение работает отлично. Я тратил время на директиву root целый день. В любом случае, большое спасибо за хорошее объяснение.

Ответить или комментировать

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