
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/html
Verzeichnis. Jeder mit mydomain.com
URL 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 demlocation /game/admin/
Block, es sei denn, Sie verwenden den^~
Modifikator (siehedieses Dokumentfür Details) - Die
root
Direktive 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/admin
In /var/www/html/my-cakephp-app/admin/webroot
diesem Fall location ~ \.php$
kann der äußere Block beide Projekte ausführen.
Eine weitere Möglichkeit ist die alias
Richtlinie. 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_name
nicht mit funktioniert alias
und $request_filename
stattdessen verwendet werden sollte.
Ich vermeide die Verwendung von alias
und try_files
zusammen aufgrunddieses Problem. Sehendiese Vorsichtzur Anwendung der if
Richtlinie.