Ich habe die folgende nginx vhost Konfiguration:
server {
listen 80 default_server;
access_log /path/to/site/dir/logs/access.log;
error_log /path/to/site/dir/logs/error.log;
root /path/to/site/dir/webroot;
index index.php index.html;
try_files $uri /index.php;
location ~ \.php$ {
if (!-f $request_filename) {
return 404;
}
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME /path/to/site/dir/webroot$fastcgi_script_name;
include /path/to/nginx/conf/fastcgi_params;
}
}
Ich möchte alle Anfragen umleiten, die nicht mit Dateien übereinstimmen, die in index.php vorhanden sind. Dies funktioniert derzeit für die meisten URIs einwandfrei, zum Beispiel:
example.com/asd
example.com/asd/123/1.txt
Weder noch asd
oder asd/123/1.txt
vorhanden, daher werden sie zu index.php umgeleitet, und das funktioniert einwandfrei. Wenn ich jedoch die URL eingebe example.com/asd.php
, versucht sie zu suchen, asd.php
und wenn sie nicht gefunden werden kann, gibt sie 404 zurück, anstatt die Anforderung an zu senden index.php
.
Gibt es eine Möglichkeit, asd.php
auch gesendet zu werden, index.php
wenn asd.php
es keine gibt?
error/404
als Pfad verwendet werden sollAntworten:
Wenn Sie sich Ihre zusätzlichen Kommentare ansehen, scheint dies der optimalste Weg zu sein, obwohl es keine hübsche Konfiguration ist.
quelle
Wow, ich denke, alles, was Sie diesen Code ersetzen möchten, ist:
... wenn ich richtig lese was du willst.
quelle
error_page 404 /error/404/
was dann umleitetindex.php
, aber dann in der php request_uri (was ich benutze, um den angeforderten Pfad zu erhalten) hat esasd.php
(vorausgesetzt, dies ist, was eingegeben wurde und führte zu der 404) und ich habe keine Möglichkeit denerror/404
Weg zu bekommen, um dann in der PHP zu handeln. Gibt es eine Möglichkeit, diesen Pfad an PHP weiterzugeben? IE Ich möchte immer noch eine einzelne front index.php, um auch Fehler zu behandeln. Wie kann ich der index.php mitteilen, dass dies ein zu behandelnder Fehler ist?Was Sie versuchen, ist dasselbe wie die benutzerdefinierte Fehlerseite. Sie können die error_page-Eigenschaft von nginx verwenden, um dies zu erreichen. Folgen Sie dem Link für weitere Informationen
http://wiki.nginx.org/HttpCoreModule#error_page
quelle
Ich denke, das Problem ist, dass Sie "try_files" zusammen mit einer "if" -Anweisung an Ihrem Standort verwenden. Aus der Dokumentation geht hervor, dass try_files ein Ersatz für die Existenzprüfung von if und mod_rewrite sein soll. Aus dem Nginx-Wiki die Seite "try_files" ( http://wiki.nginx.org/HttpCoreModule#try_files ):
"try_files ist im Grunde ein Ersatz für die typische Überprüfung der Existenz von Dateien / Verzeichnissen im mod_rewrite-Stil. Es soll effizienter sein als die Verwendung von if - siehe IfIsEvil."
Überprüfen Sie die "if" -Wiki-Seite ( http://wiki.nginx.org/NginxHttpRewriteModule#if ):
"Hinweis: Bevor Sie if verwenden, lesen Sie bitte die Seite if is evil und ziehen Sie stattdessen try_files in Betracht."
Versuchen Sie also, das zu entfernen, wenn Sie es überprüfen und einfach bei den "try_files" bleiben. Das sollte prüfen, ob eine Seite vorhanden ist (einschließlich asd.php oder eines anderen Endes in .php) und auf index.php zurückgreifen, wenn es diese nicht findet.
quelle
Es hat bei mir funktioniert!
quelle
Richard, laut Pitfalls Guide, wird empfohlen, "cgi.fix_pathinfo = 0" in php.ini zu setzen, da dies eine potenzielle Sicherheitslücke zwischen nginx und php behebt .
quelle
Ich möchte alle fehlenden PHP-Dateien auf eine benutzerdefinierte interne
/error404
Fehlerseite umleiten . Ich werde meine während der Permutation gefundene Lösung veröffentlichen.hat mir nicht geholfen. Ebenso wenig wie Kombinationen aus
location
,@missing
,rewrite
undbreak
. Aberquelle