Nginx - alterar a pasta raiz para um URL específico gera erro 404

Nginx - alterar a pasta raiz para um URL específico gera erro 404

Estou tentando organizar um bloco de localização para qualquer pessoa passar pelo mydomain.com/game/adminURL, certifique-se de que o servidor nginx para extrair o conteúdo exista no /var/www/html/my-cakephp-app/diretório. Meu aplicativo foi construído usando o framework cakephp e sua estrutura de diretórios é mostrada abaixo:

  • /var/www/html/my-cakephp-app/
    • administrador
      • Configuração
      • Console
      • Controlador
      • Visualizar
      • webroot (o arquivo index.php do ponto de entrada do aplicativo existe neste diretório)

Também tenho um site html/css estático localizado no /var/www/htmldiretório. Assim, qualquer pessoa com mydomain.comURL também pode ver esse site.

Aqui está meu bloco de servidor nginx atual:

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;
    }
}

Com esta configuração, meu site estático está funcionando bem. Mas o aplicativo cakephp dá erro 404 não encontrado no navegador. Não há erros no nginx/error.log.

Mas quando executo com a configuração nginx abaixo, meu aplicativo funciona bem. Mas preciso me livrar do meu site html/css. Estou planejando atualizar o aplicativo html/css com um site wordpress. Portanto, eu deveria ter a capacidade de executar o site wordpress como pai.

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;
    }
}

Não consegui pensar no que fiz de errado com o primeiro bloco de servidor. Qualquer sugestão seria realmente útil.

Responder1

Os dois principais problemas são:

  • o bloco externo location ~ \.php$tem precedência sobre o location /game/admin/bloco, a menos que você use o ^~modificador (consulteesse documentopara detalhes)
  • a rootdiretiva gera um caminho para o arquivo por concatenação simples, então espera-se que seu controlador esteja localizado em /var/www/html/my-cakephp-app/admin/webroot/game/admin/index.php(vejaesse documentopara detalhes)

Uma opção é mover o projeto para que a estrutura de diretórios corresponda à estrutura do URI. Isto poderia ser conseguido usando um link simbólico que aponta /var/www/html/game/adminnesse /var/www/html/my-cakephp-app/admin/webrootcaso o location ~ \.php$bloco externo será capaz de executar ambos os projetos.


Outra opção é a aliasdiretiva. Veresse documentopara detalhes.

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;
    }
}

Observe que isso $document_root$fastcgi_script_namenão funcionará aliase $request_filenamedeve ser usado.

Evito usar aliase try_filesjuntos devido aesse assunto. Veresse cuidadosobre a utilização da ifdirectiva.

informação relacionada