nginx: PHP mit FastCGI in zwei Verzeichnissen

Sickboy

Müßiggänger
Hallo,

ich habe unter FreeBSD 10 einen nginx mit FPM laufen. Dabei nutze ich mehrere Verzeichnis: einmal /var/www und jeder Benutzer kann in ~/public_html Dateien bereitstellen. Soweit so gut, leider bekomme ich FPM nicht überredet, PHP-Skripte in ~/public_html auszuführen. Wenn ich FastCGI für ~/public_html konfiguriere, findet FPM den Pfad zur PHP-Datei nicht und wirft einen 404. Wie muss "fastcgi_param SCRIPT_FILENAME" für ~/public_html korrekterweise aussehen?

/usr/local/etc/nginx/nginx.conf:
Code:
http {
  include  mime.types;
  default_type  application/octet-stream;

  [...]

  server {
    listen  80;
    server_name  localhost;
    root  /var/www;

  location / {
    index  index.html index.htm index.php;
    try_files  $uri $uri/;
  }

  location ~* \.php$ {
    try_files $uri =404;

    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass unix:/var/run/php-fpm.sock;
  }

  location ~ ^/~(.+?)(/.*)?$ {
    alias /home/$1/public_html$2;
  }

  [...]

}

Mein (nicht funktionierender) Versuch:
Code:
  location ~ ^/~(.+?)(/.*)?(.+\.php)$ {
    alias /home/$1/public_html$2;

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /home/$1/public_html$2$3;
    fastcgi_pass unix:/var/run/php-fpm.sock;
  }
 
Moin Sickboy,

probiere anstelle des "location ~ ^/~(.+?)(/.*)?$" Teils in der nginx.conf einmal folgendes:

Code:
location ~ ^/~(.+?)(/.*)?$ {
    alias /home/$1/public_html$2;

        location ~ ^/~(.+?)(/.*)?(.+\.php)$ {
            fastcgi_pass    unix:/var/run/php-fpm.sock;
            fastcgi_param   SCRIPT_FILENAME $document_root$3;
            include         fastcgi_params;
        }

}
Gruß
 
Moin Binford,

leider ändert sich dadurch nichts. Beim Anruf eines PHP-Skripts in ~/public_html wird weiterhin ein 404 geworfen.
 
Der Fehler steckt in den regulären Ausdrücken.

Beim Testen auf regexe funktioniert der erste Ausdruck fast wie geplant, lediglich $2 enthält alles bis zum Zeilenende und fügt es an den alias an. Nginx überschreibt anschließend für die location $document_root mit dem Wert aus alias. Später bei SCRIPT_FILENAME könnte $3 weg.

Der zweite Ausdruck soll ja nur php Scripte in der vorherigen location finden, aber der Pfad wird nicht an den gewünschten Stellen aufgeteilt.

Teste es einmal selbst, ich mache jetzt Feierabend :) Morgen mehr...

Gruß
 
Nicht schlecht, der Regex in location ist der selbe wie bei dir, nur mit benannten Captures.

Wieder etwas gelernt!
 
Zurück
Oben