Nginx - Das Ändern des Stammordners für eine bestimmte URL führt zu einem 404-Fehler

Nginx - Das Ändern des Stammordners für eine bestimmte URL führt zu einem 404-Fehler

Ich versuche, einen Standortblock einzurichten mydomain.com/game/admin, damit jeder über die URL darauf zugreifen kann. Stellen Sie sicher, dass der Nginx-Server, der den Inhalt abruft, im /var/www/html/my-cakephp-app/Verzeichnis vorhanden ist. Meine Anwendung wurde mit dem CakePHP-Framework erstellt und ihre Verzeichnisstruktur ist unten dargestellt:

  • /var/www/html/meine-cakephp-app/
    • Administrator
      • Konfiguration
      • Konsole
      • Regler
      • Sicht
      • Webroot (App-Einstiegspunktdatei index.php existiert in diesem Verzeichnis)

Außerdem habe ich eine statische HTML/CSS-Website im /var/www/htmlVerzeichnis. Jeder mit mydomain.comURL kann also auch diese Website sehen.

Hier ist mein aktueller Nginx-Serverblock:

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

Mit diesem Setup funktioniert meine statische Website einwandfrei. Aber die CakePHP-Anwendung gibt im Browser den Fehler 404 „Nicht gefunden“ aus. Keine Fehler im nginx/error.log.

Aber wenn ich die folgende Nginx-Konfiguration verwende, funktioniert meine Anwendung einwandfrei. Aber ich muss meine HTML/CSS-Site loswerden. Ich plane, die HTML/CSS-App mit einer WordPress-Site zu aktualisieren. Daher sollte ich die Möglichkeit haben, die WordPress-Site als übergeordnete Site auszuführen.

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

Mir fällt nicht ein, was ich beim ersten Serverblock falsch gemacht habe. Jeder Vorschlag wäre wirklich hilfreich.

Antwort1

Die beiden Hauptprobleme sind:

  • der äußere location ~ \.php$Block hat Vorrang vor dem location /game/admin/Block, es sei denn, Sie verwenden den ^~Modifikator (siehedieses Dokumentfür Details)
  • Die rootDirektive generiert durch einfache Verkettung einen Pfad zur Datei, so dass Ihr Controller sich voraussichtlich hier befindet /var/www/html/my-cakephp-app/admin/webroot/game/admin/index.php(siehedieses Dokumentfür Details)

Eine Möglichkeit besteht darin, das Projekt so zu verschieben, dass die Verzeichnisstruktur mit der URI-Struktur übereinstimmt. Dies könnte durch einen symbolischen Link erreicht werden, der auf verweist. /var/www/html/game/adminIn /var/www/html/my-cakephp-app/admin/webrootdiesem Fall location ~ \.php$kann der äußere Block beide Projekte ausführen.


Eine weitere Möglichkeit ist die aliasRichtlinie. Siehedieses Dokumentfür Details.

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

Beachten Sie, dass dies $document_root$fastcgi_script_namenicht mit funktioniert aliasund $request_filenamestattdessen verwendet werden sollte.

Ich vermeide die Verwendung von aliasund try_fileszusammen aufgrunddieses Problem. Sehendiese Vorsichtzur Anwendung der ifRichtlinie.

verwandte Informationen