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资产但没有静态文件的其他行。看起来像位置块中的重写根不起作用。任何人都可以解释发生了什么,并可能给我一些指导如何解决它?
答案 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
值。