内部位置的Nginx root指令似乎不起作用

时间:2017-11-09 04:21:28

标签: nginx configuration nginx-location

nginx版本:nginx / 1.10.3(Ubuntu) 使用OpenSSL 1.0.2g构建2016年3月1日 启用了TLS SNI支持 通过apt-get安装 使用html5样板配置项目作为基础

我一直在尝试做一个简单的任务而且它没有像我想象的那样工作。我有一个像这样的目录结构:

/var/www$ tree
.
├── docroot
│   └── files
│       ├── booger.txt
│       └── favicon.ico
└── static
    ├── h5bp
    │   ├── humans.txt
    │   ├── js
    │   │   ├── main.js
    │   │   ├── plugins.js
    │   │   └── vendor
    │   │       ├── jquery-1.12.0.min.js
    │   │       └── modernizr-2.8.3.min.js
    │   ├── tile.png
    │   └── tile-wide.png

我认为最好的方法是拥有docroot / files(真正的docroot)的服务器根,然后重新定义静态文件的根。这是我在/ etc / nginx / sites-available中的默认配置:

# Choose between www and non-www, listen on the *wrong* one and redirect to
# the right one -- http://wiki.nginx.org/Pitfalls#Server_Name
#
server {
  listen [::]:80 default_server;
  listen 80 default_server;

  # listen on all hosts
  server_name _;

  # and redirect to the https host (declared below)
  # avoiding http://www -> https://www -> https:// chain.
  return 301 https://www.ubercode.io$request_uri;
}

server {

  # listen [::]:443 ssl http2 accept_filter=dataready;  # for FreeBSD
  # listen 443 ssl http2 accept_filter=dataready;  # for FreeBSD
  listen [::]:443 ssl http2 deferred default_server;  # for Linux
  listen 443 ssl http2 deferred default_server;  # for Linux
  # listen [::]:443 ssl http2;
  # listen 443 ssl http2;

  # The host name to respond to
  server_name www.ubercode.io;

  include h5bp/directive-only/ssl.conf;

#  root /var/www/docroot/files;
  root /var/www;
  index index.html index.htm index.nginx-debian.html;

    # return forbidden for any php, asp, jsp, our .dt templates, or myadmin requests
#    location ~ (\.dt$|myadmin|\.php$|\.jsp$|\.asmx$|\.asp$) {
#       deny all;
#    }

#    location ~*  \.(jpg|jpeg|png|gif|ico|css|js)$ {
#        expires 1d;
#    }
#    location ~*  \.(pdf)$ {
#        expires 5d;
#    }

  # static
  location /static/ {
#    root /var/www;
    autoindex on;
#     expires 1d;
  }

  location / {
    alias /var/www/docroot/files;
    autoindex on;
  }
  #Specify a charset
  charset utf-8;

  # Custom 404 page
  error_page 404 /404.html;

  # Include the basic h5bp config set
  include h5bp/basic.conf;
}

server {
  listen [::]:443 ssl http2;
  listen 443 ssl http2;

  # listen on the wrong host
  server_name _;

  include h5bp/directive-only/ssl.conf;

  # and redirect to the non-www host (declared below)
  return 301 https://www.ubercode.io$request_uri;
}

如果我按照显示方式使用它,静态文件可以正常工作,但根目录上的别名似乎不起作用,因为它们抛出404.如果我在/ location和/ var / www服务器根目录下注释别名然后取消注释服务器返回docroot / files资产但没有静态文件的其他行。看起来像位置块中的重写根不起作用。任何人都可以解释发生了什么,并可能给我一些指导如何解决它?

1 个答案:

答案 0 :(得分:2)

  

如果我像显示它一样使用它,静态文件可以工作,但是别名在   根本似乎不起作用,因为他们扔了404。

您不应在alias语句中使用location /指令。请使用具有相同值的root语句。

  

如果我在/ location和/ var / www服务器下注释别名   root然后取消注释服务器返回docroot / files的其他行   资产但没有静态文件。

如果您启用location ~* \.(jpg|jpeg|png|gif|ico|css|js)$,则会覆盖location /static/块,并且会忽略后者中root的任何设置值。此外,它会覆盖以location /结尾的URI的.ico块,因此/favicon.ico将不再像其他文档根一样工作。

请参阅how nginx processes a request并注意正则表达式位置优先于前缀位置。

如果您需要微调expires值,则无法在不考虑它们影响的文档根目录的情况下添加location块。

有关替代方法,请参阅this answer,使用map指令根据expires设置$request_uri值。