J'ai une installation nginx/1.4.7 assez simple (de Debian/unstable) et j'essaie de faire en sorte que les scripts de PHP s'exécutent à l'intérieur d'un UserDir .
server {
listen 8083;
server\_name sid0.local;
index index.php index.html;
root /data/www/sid0.local;
location / {
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 on;
}
}
Accès à http://sid0.local/~dummy
fonctionne, il énumère le contenu de /home/dummy/www/
et je peux y accéder aux fichiers. En dessous de ~dummy/bar
est un fichier appelé index.php
- pourtant, l'accès http://sid0.local/~dummy/bar/
entraîne l'erreur redoutée "Fichier non trouvé" (et non pas une erreur 404). Le site error.log
a :
2014/04/30 23:07:44 \[error\] 4237#0: \*9 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 192.168.0.103, server: sid0.local, request: "GET /~dummy/bar/ HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "sid0.local:8083"
Maintenant, de nombreuses personnes semblent avoir ce problème et certains d'entre eux postent même solutions comme s'assurer que SCRIPT_FILENAME
est réglé sur request_filename
- mais c'est déjà le cas (c'est défini dans fastcgi_params).
Cependant, l'exécution strace(1)
contre le processus nginx donne (édité pour la lisibilité) :
4045 connect(16, {sa\_family=AF\_FILE, path="/var/run/php5-fpm.sock"}, 110) = 0
4045 writev(16, \[{"\\1\\1\\0\\1\\0\\10\\0\\0\\0\\1\\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
Comme vous pouvez le voir, SCRIPT_FILENAME
n'est PAS request_filename
mais à la place document_root+fastcgi_script_name
- d'où la 404, bien sûr.
Donc, je suppose que ma question est : pourquoi mon SCRIPT_FILENAME
mangled (j'ai même réglé sur fastcgi_script_name
pas de chance) et comment puis-je obtenir des scripts PHP à l'intérieur d'un fichier UserDir
en train de courir ?