2017-11-15 7 views
1

Ich führe Nginx in einem Docker-Container. Ich möchte ein Unterverzeichnis /web/ haben, um auf meine persönlichen Dateien und Projekte zugreifen zu können. Es sollte auch php unterstützen.Nginx-Unterverzeichnis root mit PHP

Unten ist, was ich renne, aber domain-a.com/web bleibt in einem 404. PHP funktioniert bestätigt, da der gleiche PHP-Block auf einer Subdomain aber direkt in einem server{} Block arbeitet.

http { 

    server { 
     listen  443 ssl; 
     server_name domain-a.com domain-b.com; 

     # Mime types 
     include /etc/nginx/confs/mime.types; 

     # SSL 
     include /etc/nginx/confs/nginx-ssl.conf; 

     # Proxy to organizr 
     # This works 
     location/{ 
      proxy_pass http://organizr/; 
      proxy_set_header Host $http_host; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header X-Forwarded-Proto $scheme; 

      # HTTP 1.1 support 
      proxy_http_version 1.1; 
      proxy_set_header Connection ""; 
     } 

     # Root folder for my personal files/projects 
     # Doesn't work 
     location /web { 
      index index.php index.html; 
      root /etc/nginx/www; 

      location ~ \.php$ { 
       try_files $uri =404; 
       fastcgi_split_path_info ^(.+\.php)(/.+)$; 
       fastcgi_pass php:9000; 
       fastcgi_index index.php; 
       include fastcgi_params; 
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
       fastcgi_param PATH_INFO $fastcgi_path_info; 
      } 
     } 
    } 
} 
+0

Sind Ihre Dateien auch in einem Unterverzeichnis, d. H. '/ Etc/nginx/www/web /'? –

+0

@RichardSmith Nein, sie sind in '/ etc/nginx/www /' – Bob

Antwort

1

Wenn Ihre Dateien in /etc/nginx/www sind, müssen Sie eine alias Richtlinie verwenden, anstatt eine root Richtlinie. Siehe this document für Details.

Zum Beispiel:

location ^~ /web { 
    index index.php index.html; 
    alias /etc/nginx/www; 

    if (!-e $request_filename) { rewrite^/web/index.php last; } 

    location ~ \.php$ { 
     if (!-f $request_filename) { return 404; } 

     fastcgi_pass php:9000; 
     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $request_filename; 
    } 
} 

Verwenden $request_filename den richtigen Pfad zu der aliased-Datei zu erhalten. Vermeiden Sie try_files mit alias wegen this issue. Siehe this caution über die Verwendung von if.

+0

Vielen Dank. Das ist die Antwort. Arbeitete sofort. – Bob