2016-07-22 24 views
1

Ich versuche herauszufinden, warum die / die \.php$ locations directive nicht erlaubt, das Skript aufzunehmen.

Unten ist ein Beispiel .conf Ich verwende für Nginx. Wir führen API-Code aus, der im Pfad versioniert ist: //domian.com/v#.#/endpoint/uri

Unser Dokumentstammverzeichnis ist ein Verzeichnis unterhalb der Versionsnummer. index.php existiert innerhalb der Versionsverzeichnis: path/to/sites/public/v1.0/index.php

index index.php # <-- this is in here globally 
location ~ ^/(?<version>v[\d\.]+) { 
    try_files $uri $version/index.php?$args; 
    # Why does this NOT work? The/stopping \.php$ from matching 
    # try_files $uri /$version/index.php?$args; 
} 

location ~ \.php$ { 

    fastcgi_pass php56; 
    fastcgi_index index.php; 
    fastcgi_split_path_info ^(.+\.php)(/.*)$; 
    include fastcgi_params; 
    [...] 
} 

ich alle möglichen Dinge versucht haben, kann aber nicht diese Arbeit zu bekommen scheinen. Sobald ich die / entfernen funktioniert es wie erwartet, aber dann ändert sich meine SCRIPT_FILENAME Zeile von:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 

An:

fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; 

Und das bricht direkte PHP-Datei Anrufe - etwas, was ich nicht will.

Bearbeiten: Lösung: Beantwortet unten: Das Problem hatte mit der Reihenfolge der Übereinstimmung zu tun. Mustererkennung wird zuerst gefunden, nicht zuletzt entdeckt.

Die Reihenfolge wurde geändert. Es fehlgeschlagen die erste try_files, weil das Muster explizit mit / beginnend gesucht.

Ich lese: http://nginx.org/en/docs/http/request_processing.html

Eine Anfrage „index.php“ wird auch durch die Vorsilbe Lage „/“ zuerst und dann durch den regulären Ausdruck „(php) $.“ Abgestimmt. Daher wird von der letzteren Position behandelt und die Anforderung wird an einen FastCGI-Server übergeben, der auf localhost: 9000 abhört.

+0

Haben Sie 'index index.php' in Ihrer ersten' location' Sektion ausprobiert? – miken32

+0

Oder nur in Ihrem 'http' Abschnitt wäre besser. – miken32

+0

Funktioniert nicht. Ich habe eine globale Index-Direktive. Ich habe hier einen hinzugefügt und auch keinen. Nginx nimmt die Datei '/ v1.0/index.php' als statische Datei und zeigt sie direkt an (ich habe 'default_type text/plain' global hinzugefügt, um den Download-Standard von application/oct ... stream zu verhindern). – guice

Antwort

1

Das erste, was zu beachten ist, dass regex Stellen in der Datei ausgewertet werden, so dass, wenn /v1.1 die erste Lage Block übereinstimmt, dann /v1.1/index.php wird auch die erste Lage Block entsprechen. Sie scheinen das Problem falsch zu beheben, indem Sie fehlerhafte URIs mit einer fehlenden führenden / erstellen.

Weitere Informationen finden Sie unter this document.

Sie benötigen location ~ \.php$ Block vor Ihren location ~ ^/(?<version>v[\d\.]+) Block zu platzieren, um .php Dateien mit der Version Präfix zu ermöglichen, durch den PHP-Block verarbeitet werden.

+0

Nun, ich werde verdammt sein.Das war's. Vielen Dank! Ich dachte, es wäre ein "Überladungs" -Muster (last in rules): "Eine Anfrage" /index.php "wird auch durch den Präfix location"/"zuerst und dann durch den regulären Ausdruck" \. (Php) $ "verglichen ". Daher wird es von dem letzteren Ort behandelt und die Anfrage wird an einen FastCGI-Server weitergeleitet, der auf localhost: 9000 hört" - http://nginx.org/en/docs/http/request_processing.html – guice