2016-03-22 14 views
2

Ich versuche Nginx zu konfigurieren, statische und PHP-Dateien zu dienen. Die Konfiguration, die ich habe, funktioniert nicht. Ich möchte folgende lokale Ordnerstruktur:NGINX-Konfiguration für statische und PHP-Dateien

src/static/ -> contains HTML, CSS, JS, images etc 
src/api/  -> contains PHP files for a small REST service 

Wenn ich besuchen http://mysite.local Ich möchte Dateien aus dem Verzeichnis/statischen Ordner serviert werden. Wenn ich http://mysite.local/api besuche möchte ich die API PHP-Dateien bedient werden. Ich möchte, dass die Anfragen an die API neu geschrieben und an eine index.php-Datei gesendet werden.

Einige Beispiele:

http://mysite.local/test.html     -> served from src/static/test.html 
http://mysite.local/images/something.png  -> served from src/static/images/something.png 
http://mysite.local/css/style.css    -> served from src/static/css/style.css 

http://mysite.local/api/users     -> served from src/api/index.php?users 
http://mysite.local/api/users/bob    -> served from src/api/index.php?users/bob 
http://mysite.local/api/biscuits/chocolate/10 -> served from src/api/index.php?biscuits/chocolate/10 

Die folgenden Konfigurationsarbeiten für statische Dateien aber nicht für die api-Dateien. Ich bekomme einen 404-Fehler zurück, wenn ich einen der API-Pfade besuche.

server { 
    listen  80; 
    server_name mysite.local; 
    access_log /var/log/nginx/mysite.access.log main; 
    error_log /var/log/nginx/mysite.error.log debug; 


    location/{ 
     index index.html; 
     root /var/www/mysite/src/static; 
     try_files $uri $uri/ =404; 
    } 

    location /api { 
     index index.php; 
     root /var/www/mysite/src/api; 
     try_files $uri $uri/ /index.php?$query_string; 

     location ~ \.php$ { 
      try_files  $uri = 404; 
      fastcgi_pass 127.0.0.1:9000; 
      fastcgi_index index.php; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      include  fastcgi_params; 
     } 
    } 
} 

Antwort

1

Das anfängliche Problem ist die root Richtlinie im location /api Block, der nicht die Standortkomponente enthalten sollte, da dies als Teil der URI angehängt wird, so:

location /api { 
    root /var/www/mysite/src; 
    ... 
} 

in einem lokalen führen Pfad von /var/www/mysite/src/api/index.php, wenn mit der URI /api/index.php vorgelegt. Details finden Sie unter this document. Die try_files Regel schreibt den URI nicht wie in Ihrem Beispiel angegeben. Wenn Sie wirklich den endgültigen Pfad des URI benötigen, der als Abfragezeichenfolge zu /api/index.php präsentiert werden soll, müssen Sie rewrite verwenden.

Die einfachste Lösung (wenn Sie statische Inhalte nicht von diesem Ort dienen müssen) ist Ihr zu ersetzen try_files mit:

location /api { 
    ... 
    rewrite ^/api/(.*)$ /api/index.php?$1 last; 

    location ~ \.php$ { ... } 
} 

Andernfalls eine benannte Stelle verwenden:

location /api { 
    ... 
    try_files $uri $uri/ @rewrite; 

    location ~ \.php$ { ... } 
} 
location @rewrite { 
    rewrite ^/api/(.*)$ /api/index.php?$1 last; 
} 

See this und this für Details.

+0

Vielen Dank für die sehr hilfreiche Antwort. Das Hauptproblem war die Definition der Wurzel im/api Location Block. – Bob