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

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

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

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

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

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

server {
    listen 80;
    listen [::]:80;

    root /var/www/html;

    index index.html index.htm index.php;

    server_name mydomain.com;

    location / {
        try_files $uri $uri/ =404;
    }
    
    location /game/admin {
            return 301 /game/admin/;
    }

    location /game/admin/ {

                root /var/www/html/my-cakephp-app/admin/webroot;
                try_files $uri $uri/ /game/admin/index.php$is_args$args;
  
                location ~* \.php(/|$) {
                  include snippets/fastcgi-php.conf;
                  fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
               } 

    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

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

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

server {
    listen 80;
    server_name mydomain.com;
    root /var/www/html/my-cakephp-app/admin/webroot;
    
    index index.html index.htm index.php;
 
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
        autoindex on;
    }
    
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
    
    location ~ /\.ht {
        deny all;
    }
}

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

решение1

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

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

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


Другой вариант — aliasдиректива. См.этот документдля получения подробной информации.

location ^~ /game/admin {
    alias /var/www/html/my-cakephp-app/admin/webroot;

    if (!-e $request_filename) { rewrite ^ /game/admin/index.php last; }

    location ~ \.php$ {
        if (!-f $request_filename) { return 404; }

        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $request_filename;
    }
}

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

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

Связанный контент