Drupal 8 Nginx错误没有这样的文件或目录的任何路线

我在Nginx + PHP7 + PHP 7 FPMDocker上运行Drupal 8.1.2,并且链接到另一个基于Alpine Linux的PostgreSQL Docker镜像。

在成功运行Drupal安装(在core / install.phpurl)并设置网站名称,pipe理员名称和其他细节之后,它在我点击提交button后立即抛出404。 我只能访问/update.phpurl。

错误日志 :

 2016/06/17 16:32:49 [error] 11#0: *80 open() "/usr/share/nginx/html/404.html" failed (2: No such file or directory), client: 172.17.0.1, server: _, request: "GET /favicon.ico HTTP/1.1", host: "localhost" 2016/06/18 11:47:32 [error] 13#0: *40 open() "/var/www/html/user/1" failed (2: No such file or directory), client: 172.17.0.1, server: _, request: "GET /user/1 HTTP/1.1", host: "localhost", referrer: "http://localhost/core/install.php?langcode=en&profile=minimal" 2016/06/18 11:29:00 [error] 170#0: *83 open() "/var/www/html/update.php/selection" failed (20: Not a directory), client: 172.17.0.1, server: _, request: "GET /update.php/selection HTTP/1.1", host: "localhost", referrer: "http://localhost/update.php" 2016/06/18 11:28:19 [error] 170#0: *83 open() "/var/www/html/node" failed (2: No such file or directory), client: 172.17.0.1, server: _, request: "GET /node HTTP/1.1", host: "localhost" 2016/06/18 11:28:19 [error] 170#0: *83 open() "/usr/share/nginx/html/404.html" failed (2: No such file or directory), client: 172.17.0.1, server: _, request: "GET /node HTTP/1.1", host: "localhost" 

nginx.conf

 server { listen [::]:80; server_name localhost; location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } # Very rarely should these ever be accessed outside of your lan location ~* \.(txt|log)$ { allow 192.168.0.0/16; deny all; } location ~ \..*/.*\.php$ { return 403; } location ~ ^/sites/.*/private/ { return 403; } # Allow "Well-Known URIs" as per RFC 5785 location ~* ^/.well-known/ { allow all; } # Block access to "hidden" files and directories whose names begin with a # period. This includes directories used by version control systems such # as Subversion or Git to store control files. location ~ (^|/)\. { return 403; } location / { # try_files $uri @rewrite; # For Drupal <= 6 try_files $uri /index.php?$query_string; # For Drupal >= 7 } location @rewrite { rewrite ^/(.*)$ /index.php?q=$1; } # Don't allow direct access to PHP files in the vendor directory. location ~ /vendor/.*\.php$ { deny all; return 404; } # In Drupal 8, we must also match new paths where the '.php' appears in # the middle, such as update.php/selection. The rule we use is strict, # and only allows this pattern with the update.php front controller. # This allows legacy path aliases in the form of # blog/index.php/legacy-path to continue to route to Drupal nodes. If # you do not have any paths like that, then you might prefer to use a # laxer rule, such as: # location ~ \.php(/|$) { # The laxer rule will continue to work if Drupal uses this new URL # pattern with front controllers other than update.php in a future # release. location ~ '\.php$|^/update.php|selection$|add$|^/user/\d' { fastcgi_split_path_info ^(.+?\.php)(|/.*)$; # Security note: If you're running a version of PHP older than the # latest 5.3, you should have "cgi.fix_pathinfo = 0;" in php.ini. # See http://serverfault.com/q/627903/94922 for details. include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_intercept_errors on; fastcgi_pass unix:/var/run/php7.0-fpm.sock; } # Fighting with Styles? This little gem is amazing. # location ~ ^/sites/.*/files/imagecache/ { # For Drupal <= 6 location ~ ^/sites/.*/files/styles/ { # For Drupal >= 7 try_files $uri @rewrite; } # Handle private files through Drupal. location ~ ^/system/files/ { # For Drupal >= 7 try_files $uri /index.php?$query_string; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } } 

default.conf

 # # The default server # server { listen 80 default_server; server_name _; root /var/www/html; #charset koi8-r; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log; location / { index index.html index.htm index.php; } error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { fastcgi_pass localhost:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.ht { deny all; } } 

/etc/nginx/文件树

 /etc # tree nginx nginx ├── conf.d │  └── default.conf ├── default.d ├── fastcgi.conf ├── fastcgi_params ├── koi-utf ├── koi-win ├── mime.types ├── nginx.conf ├── scgi_params ├── uwsgi_params └── win-utf 2 directories, 10 files 

这个configuration看起来对于Drupal 8来说是无效的。根据https://pantheon.io/blog/update-your-nginx-config-drupal-8文章,Drupal 8有一些不同寻常的path,需要分别在nginxconfiguration。 文章应该包含您需要解决问题的信息。

我认为你使用try_files错误的部分

 location / { # try_files $uri @rewrite; # For Drupal <= 6 try_files $uri /index.php?$query_string; # For Drupal >= 7 } 

try_files的最后一个参数是“404”位置。 如果你编辑它

 try_files $uri /index.php?$query_string =404; 

它可能工作

通过在/etc/nginx/conf.d/default.conf添加此configuration来解决此 /etc/nginx/conf.d/default.conf

 # # The default server # server { server_name drupaldocker.com; root /var/www/html; ## <-- Your only path reference. location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } # Very rarely should these ever be accessed outside of your lan location ~* \.(txt|log)$ { allow 192.168.0.0/16; deny all; } location ~ \..*/.*\.php$ { return 403; } location ~ ^/sites/.*/private/ { return 403; } # Allow "Well-Known URIs" as per RFC 5785 location ~* ^/.well-known/ { allow all; } # Block access to "hidden" files and directories whose names begin with a # period. This includes directories used by version control systems such # as Subversion or Git to store control files. location ~ (^|/)\. { return 403; } location / { # try_files $uri @rewrite; # For Drupal <= 6 try_files $uri /index.php?$query_string; # For Drupal >= 7 } location @rewrite { rewrite ^/(.*)$ /index.php?q=$1; } # Don't allow direct access to PHP files in the vendor directory. location ~ /vendor/.*\.php$ { deny all; return 404; } # In Drupal 8, we must also match new paths where the '.php' appears in # the middle, such as update.php/selection. The rule we use is strict, # and only allows this pattern with the update.php front controller. # This allows legacy path aliases in the form of # blog/index.php/legacy-path to continue to route to Drupal nodes. If # you do not have any paths like that, then you might prefer to use a # laxer rule, such as: # location ~ \.php(/|$) { # The laxer rule will continue to work if Drupal uses this new URL # pattern with front controllers other than update.php in a future # release. location ~ '\.php$|^/update.php' { fastcgi_split_path_info ^(.+?\.php)(|/.*)$; # Security note: If you're running a version of PHP older than the # latest 5.3, you should have "cgi.fix_pathinfo = 0;" in php.ini. # See http://serverfault.com/q/627903/94922 for details. include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_intercept_errors on; fastcgi_pass localhost:9000; } # Fighting with Styles? This little gem is amazing. # location ~ ^/sites/.*/files/imagecache/ { # For Drupal <= 6 location ~ ^/sites/.*/files/styles/ { # For Drupal >= 7 try_files $uri @rewrite; } # Handle private files through Drupal. location ~ ^/system/files/ { # For Drupal >= 7 try_files $uri /index.php?$query_string; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } } 

如果FastCGI指定为fastcgi_pass unix:/var/run/php7.0-fpm.sock; FastCGI也会被拒绝连接 fastcgi_pass unix:/var/run/php7.0-fpm.sock;

我现在唯一的缺点是我无法通过扩展部分下载任何模块/主题,但这只是一个文件夹权限问题。