Ich versuche, eine Nginx-Konfiguration zu erreichen, die es mir ermöglicht, basierend auf einem Teil der URL/des Servernamens den Projektordner (document_root) auszuwählen, alles dynamisch.
Wenn ich also ein Webserver-Verzeichnis wie das folgende hätte:
/var/www/projecta
/var/www/project-b
/var/www/projectc
Und ich habe die folgenden URL-Übereinstimmungen erhalten:
www.something.projecta.demo.com -> /var/www/projecta/
xyz.project-b.demo.com -> /var/www/projectb/
aaa.bbb.ccc.ddd.projectc.demo.com -> /var/www/projectc/
und so weiter.
Ich habe es mit der folgenden Konfiguration versucht und es funktioniert mit statischen Dateien, aber nicht mit PHP. Soweit ich sehen und sagen kann, ist die Pfadinfo immer leer.
upstream php-www {
server unix:/dev/shm/php-www.socket;
}
server {
listen *:80;
server_name ~^(?<subdomain>.+)(?<project>[^.]+).demo.com;
root /var/www/$project/htdocs/;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ [^/]\.php(/|$) {
include fastcgi_params;
#Save path_info before it gets killed
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_ignore_client_abort off;
fastcgi_pass php-www;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
try_files $fastcgi_script_name $uri /index.php?$query_string;
}
}
Mit statischen Dateien und nicht mit PHP-Speicherort scheint es gut zu funktionieren. Die Datei index.php enthält eigentlich nur ein phpinfo();
Die Fehlermeldung, die ich bekomme, ist:
[error] 7763#7763: *3 rewrite or internal redirection cycle while internally redirecting to "/index.php", client: 192.168.2.100, server: ~^(?<subdomain>.+)(?<project>[^.]+).demo.com, request: "GET / HTTP/1.1", host: "www.foo.bar.demo.com"
Irgendwelche Ideen?
Zusätzliche Informationen:
Betriebssystem: Debian Jessie (ursprüngliches Nginx-Repository) PHP-Version: PHP 5.6.29-0+deb8u1 (cgi.fix_pathinfo=0) nginx-Versionsausgabe:
nginx version: nginx/1.10.2
built by gcc 4.9.2 (Debian 4.9.2-10)
built with OpenSSL 1.0.1t 3 May 2016
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-file-aio --with-threads --with-ipv6 --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed'
Antwort1
Die Fehlermeldung ist eine Umleitungsschleife, /index.php
die wahrscheinlich auf die letzte try_files
Anweisung verweist. Offensichtlich $fastcgi_script_name
ist sie ungültig, bis fastcgi_split_path_info
die URI verarbeitet wurde. Beachten Sie, dass dieoffiziell nginx
Rezeptvermeidet die Verwendung try_files
und verwendet if
stattdessen einen Block.
Ich würde vorschlagen, dass Sie Folgendes versuchen:
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
rewrite ^ /index.php last;
}
fastcgi_pass php-www;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_ignore_client_abort off;
}
Wenn dies wirklich nicht der Fall ist, kommt es natürlich /index.php
trotzdem zu einer Umleitungsschleife.