2016-06-28 12 views
2

dient, werden einige PHP URLs gedownloadet, anstatt von Nginx ausgeführt zu werden. Ich habe eine bestehende Web-Anwendung, die gut funktioniert. Ich habe die Aufgabe, zusätzliche gemountete Anwendungen in Ordnern der primären Anwendung hinzuzufügen. Jede dieser Anwendungen hat ihren eigenen Front Controller index.php Skript.nginx, das einige PHP-URLs als Downloads anstelle von

Für dieses Setup habe ich Symlinks innerhalb $document_root/app erstellt, und die Symlinks zeigen auf einen Ordner mit einem index.php Front Controller.

Wenn ich zu den meisten URLs navigiere, funktioniert alles gut, der primäre Front Controller der Anwendung wird ausgeführt, und ich bekomme die erwarteten Ergebnisse. Wenn ich zu einer nicht existierenden App navigiere, bekomme ich 404 Not Found von nginx, was erwartet wird. Wenn ich jedoch zu einer der Anwendungen navigiere, lädt der Browser den Front Controller der Anwendung herunter.

root     /my/web/root; 

location/{ 
    try_files   $uri 
         /$server_name$uri 
         /shared$uri 
         /index.php$is_args$args; 
} 

location ~ [^/]\.php(/|$) { 
    disable_symlinks off; 
    fastcgi_split_path_info ^(.+\.php\b)(.*)$; 
    fastcgi_param  SERVER_NAME $host; 
    fastcgi_param  PATH_INFO $fastcgi_path_info; 
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_param  SCRIPT_NAME /index.php; 
    fastcgi_index  index.php; 
    include    fastcgi.conf; 
    fastcgi_pass  php-fpm; 
} 

location ~ ^/app/([a-z-]+)(/.*)?$ { 
    try_files   $uri 
         /app/$1/index.php$is_args$args 
         =404; 
} 

URL der Download-Trigger:/app/my-app/(vorhanden)
URL die 404s:/app/foo/(existiert nicht)
URL, die ausführt:/foo

+0

Versuchen Sie den Speicherort für php auf 'location ~ [^ /] \. Php (/ | $)' –

+0

Gleiches Ergebnis .... –

Antwort

2

Die .php Datei muss von der 0 verarbeitet werdenBlock. Sie haben ein gemeinsames Dokumentenstammverzeichnis, das die Dinge vereinfacht.

Jedoch look at this document in Bezug auf die location Richtlinie.

Sie werden sehen, dass die Regex-Positionen als in der Reihenfolge betrachtet werden und die erste übereinstimmende Position zur Verarbeitung der Anforderung verwendet wird.

Kurz gesagt, müssen Sie den location ~ [^/]\.php(/|$) Block vor andere widersprüchliche regex Stelle platzieren, wenn Sie Ihre .php Dateien korrekt verarbeitet werden sollen.

+0

Keine Änderung im Verhalten. Explizite '.../app/index.php' URL wird ausgeführt, implizite' .../app/'URL Downloads, non-app URLs werden ausgeführt. –

+3

Sie haben einen Fehler in Ihrer letzten 'try_files' Direktive. Entferne das '= 404'. Das Element '/ app/$ 1/index.php $ is_args $ args' muss als letztes in der Zeile stehen. Einzelheiten finden Sie in diesem Dokument (http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files). –

+1

Mehr darüber, warum '= 404' Dinge bricht: [try_files] (http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files) bedient" die erste gefundene Datei "aus ihrer Liste" im aktuellen Kontext ". Für '/ app/my-app' ist dieser Kontext der' location ~ ^/app/([az -] +) (/.*)? $ 'Block, der nicht mit PHP umgeht - also sendet nginx das rohe '/ app/my-app/index.php' Quelldatei. Der letzte Eintrag in einer try_files-Liste wird jedoch * umgeleitet * zu. Wenn '/ app/$ 1/index.php' das letzte Mal ist, wird es zum' location ~ [^ /] \ .php (/ | S) 'Block umgeleitet, der PHP beherrscht - also nach dem Entfernen von' = 404' my-app Front-Controller wird ausgeführt. –

Verwandte Themen