Puncte:1

Nginx - schimbarea folderului rădăcină pentru o anumită adresă URL dă eroare 404

drapel us

Încerc să aranjez un bloc de locație pentru ca oricine să treacă mydomain.com/game/admin url, asigurați-vă că serverul nginx pentru a extrage conținutul există /var/www/html/my-cakephp-app/ director. Aplicația mea este construită folosind cakephp framework și structura sa de directoare este prezentată mai jos:

  • /var/www/html/my-cakephp-app/
    • admin
      • Config
      • Consolă
      • Controlor
      • Vedere
      • webroot (Fișierul index.php pentru punctul de intrare al aplicației există în acest director)

De asemenea, am un site static html/css situat în /var/www/html director. Deci oricine cu mydomain.com url poate vedea și site-ul respectiv.

Iată blocul meu actual de server nginx:

Server {
    asculta 80;
    asculta [::]:80;

    rădăcină /var/www/html;

    index index.html index.htm index.php;

    nume_server domeniul meu.com;

    Locație / {
        try_files $uri $uri/ =404;
    }
    
    locație /joc/admin {
            returnează 301 /game/admin/;
    }

    locație /joc/admin/ {

                root /var/www/html/my-cakephp-app/admin/webroot;
                try_files $uri $uri/ /game/admin/index.php$is_args$args;
  
                locație ~* \.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;
               } 

    }

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

    locație ~ /\.ht {
        nega totul;
    }
}

Cu această configurare, site-ul meu web static funcționează bine. Dar aplicația cakephp dă eroarea 404 negăsit în browser. Nu există erori în nginx/error.log.

Dar când rulez cu configurația nginx de mai jos, aplicația mea funcționează bine. Dar trebuie să scap de site-ul meu html/css. Plănuiesc să fac upgrade aplicației html/css cu un site wordpress. Așa că ar trebui să am capacitatea de a rula site-ul wordpress ca părinte.

Server {
    asculta 80;
    nume_server domeniul meu.com;
    root /var/www/html/my-cakephp-app/admin/webroot;
    
    index index.html index.htm index.php;
 
    Locație / {
        try_files $uri $uri/ /index.php$is_args$args;
        autoindex activat;
    }
    
    locație ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
    
    locație ~ /\.ht {
        nega totul;
    }
}

Nu m-am putut gândi la ce am greșit cu primul bloc de server. Orice sugestie ar fi de mare ajutor.

Puncte:1
drapel jp

Cele două probleme principale sunt:

  • Exterior locație ~ \.php$ blocul are prioritate asupra locație /joc/admin/ blocați dacă nu utilizați ^~ modificator (vezi acest document pentru detalii)
  • cel rădăcină directiva generează o cale către fișier prin concatenare simplă, astfel încât controlerul dvs. este de așteptat să fie localizat la /var/www/html/my-cakephp-app/admin/webroot/game/admin/index.php (vedea acest document pentru detalii)

O opțiune este să mutați proiectul astfel încât structura directorului să se potrivească cu structura URI. Acest lucru ar putea fi realizat folosind o legătură simbolică care indică /var/www/html/game/admin la /var/www/html/my-cakephp-app/admin/webroot caz în care exteriorul locație ~ \.php$ block va putea executa ambele proiecte.


O altă opțiune este alias directivă. Vedea acest document pentru detalii.

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

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

    locație ~ \.php$ {
        if (!-f $nume_fișier_cerere) { return 404; }

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

Rețineți că $document_root$fastcgi_script_name nu va lucra cu alias și asta $request_filename ar trebui folosit în schimb.

Evit sa folosesc alias și try_files împreună din cauza această problemă. Vedea această precauție cu privire la utilizarea dacă directivă.

Madushan Perera avatar
drapel us
Soluția ta funcționează perfect. Îmi pierdeam timpul cu directiva root toată ziua. Oricum, multumesc mult pentru explicatia buna.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.