Nginx & UserDir & PHP

4721
ckujau

Ich habe eine relativ einfache nginx / 1.4.7-Installation (von Debian / unstable) und versuche PHP-Skripte in einem UserDir auszuführen .

Server { hör 8083;  server_name sid0.local; index index.php index.html; root /data/www/sid0.local;  Standort / { try_files $ uri $ uri / = 404; }  # PHP-FPM location ~ \ .php $ { include fastcgi_params; fastcgi_pass unix: /var/run/php5-fpm.sock; fastcgi_index index.php; }  # UserDir location ~ ^ / ~ (. +?) (/.*)? $ { Alias ​​/ home / $ 1 / www $ 2; Autoindex ein; } } 

Zugriff auf http://sid0.local/~dummyWerke, listet den Inhalt von /home/dummy/www/und ich kann dort auf Dateien zugreifen. Darunter ~dummy/barbefindet sich eine Datei mit dem Namen index.php- der Zugriff http://sid0.local/~dummy/bar/bringt jedoch die gefürchtete Datei "Datei nicht gefunden". Fehler (nicht 404). Das error.loghat:

30.04.2014 23:07:44 [Fehler] 4237 # 0: * 9 FastCGI hat in stderr gesandt: "Primäres Skript unbekannt" beim Lesen des Antwortheaders aus dem Upstream-Client, 192.168.0.103, Server: sid0.local, Anforderung: "GET / ~ dummy / bar / HTTP / 1.1", Upstream: "fastcgi: // unix: /var/run/php5-fpm.sock:", host: "sid0.local: 8083" 

Nun, viele Menschen scheinen dieses Problem zu haben und einige von ihnen sind sogar Entsendung Lösungen, wie um sicherzustellen, dass SCRIPT_FILENAMEauf gestellt ist request_filename- aber das ist bereits der Fall (es ist festgelegt in fastcgi_params).

strace(1)Wenn Sie jedoch gegen den Nginx-Prozess laufen, erhalten Sie (zur besseren Lesbarkeit bearbeitet):

4045 connect (16,, 110) = 0 4045 writev (16, [{\ 1 \ 1 \ 0 \ 1 \ 0 \ 10 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 1 \ 4 \ 0 \ 1 \ 3T \ 4 \ 0 \ f \ 0 QUERY_STRING \ 16 \ 3 REQUEST_METHODGET \ f \ 0 CONTENT_TYPE \ 16 \ 0 CONTENT_LENGTH \ 0170 SCRIPT_FILENAME / data / www / sid0.local / ~ dummy / bar / index.php \ v \ 25 SCRIPT_NAME / ~ dummy / bar / index.php \ v \ f REQUEST_URI / ~ dummy / bar / \ f \ 25 DOCUMENT_URI / ~ dummy / bar / index.php \ r \ 33 DOCUMENT_ROOT / data / www / sid0.local 

Wie Sie sehen können, SCRIPT_FILENAMEist es NICHT, request_filenamesondern stattdessen document_root+fastcgi_script_name- daher natürlich die 404.

Ich denke also, meine Frage ist: Warum ist mein SCRIPT_FILENAMEVerstümmeltes (ich habe es sogar eingestellt fastcgi_script_name, kein Glück) und wie bekomme ich PHP-Skripte in einem UserDirLauf?

3
nginx `location`s sind exklusiv. Wenn Ihre Anfrage an einem Speicherort für PHP-Dateien landet, sucht nginx nicht nach anderen übereinstimmenden Speicherorten. Daher kennt nginx nichts über die `alias`-Direktive am _userDir_-Speicherort. Alexey Ten vor 10 Jahren 0
Vielen Dank. Aber als ich den PHP-Part in den UserDir-Part eingefügt habe, hat sich daran nichts geändert, `SCRIPT_FILENAME` war immer noch entstellt. ckujau vor 10 Jahren 0

2 Antworten auf die Frage

1
Alexey Ten

Ich würde root-Verzeichnis ändern anstatt Alias ​​in location zu verwenden. Es könnte so aussehen:

listen 8083;  server_name sid0.local; index index.php index.html;  # Here is magic set $root_dir /data/www/sid0.local; rewrite ^(/~[^/]+)$ $1/ redirect; rewrite ^/~(?<user>[^/]+)(.+) $2; if ($user) { set $root_dir /home/$user/www; } root $root_dir;  # PHP-FPM location ~ \.php$ { try_files $uri =404; include fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; } 

Eine andere Version ohne umschreiben:

listen 8083;  server_name sid0.local; index index.php index.html;  root /data/www/sid0.local;  location ~ ^/~(?<user>[\w-]+)(?<path>/.*)$ { alias /home/lynn/tmp/site/$user/www$path; autoindex on;  # PHP-FPM location ~ \.php$ { try_files $uri =404; include fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; } } 

Aus irgendeinem Grund aliasfunktioniert Named Captures, während es bei numerischen Referenzen fehlschlägt. Meine Vermutung, dass numerische Referenzen irgendwie an verschachtelten Stellen gelöscht werden.

Wow, das ist wahrlich magisch. Ich hätte gehofft, dass dies ohne Umschreiben von Tricks geschehen könnte - es ist nur ein Userdir und umschreibende Regeln (und [if] (http://wiki.nginx.org/IfIsEvil)) scheinen immer so zerbrechlich zu sein. Ich kann auch nicht mehr "autoindex" in der Benutzerliste einstellen. Aber ansonsten funktioniert das, danke! ckujau vor 10 Jahren 0
@ckujau siehe Update Alexey Ten vor 10 Jahren 0
Danke für das Update. Entschuldigung, ich habe eine Weile gebraucht, um das zu testen. Leider funktioniert das hier nicht, ich bekomme 404-Fehler beim Zugriff auf ~ dummy / bar / index.php. Ich werde dies zu einer Nginx-Mailingliste bringen. Vielen Dank für deine Eingabe! ckujau vor 9 Jahren 0
0
sudoman

Basierend auf der Antwort von Alexy Ten habe ich die folgenden Konfigurationsdateien so eingefügt, /etc/nginx/default.d/wie sie nginx.confin meiner Standardinstallation enthalten sind:

$ cat 00-index.conf  index index.html;  $ cat 50-userdirs.conf location ~ ^/~(?<user>[\w-]+)(?<path>/?.*)$ { alias /home/$user/www$path; autoindex on; } 

Beachten Sie das hinzugefügte ?Symbol nach dem /Symbol, um hostname/~userohne nachstehenden Schrägstrich übereinzustimmen. Das behebt einen 404-Fehler.

Wenn Sie aufgrund von SELinux 403 Fehler erhalten, müssen Sie Ihre Zugriffsregeln aktualisieren:

# semanage fcontext -a -t httpd_user_content_t '/home/[^/]*/www/.*' # for userdir in /home/* ; do restorecon -Rvi "$userdir/www" ; done