我正在尝试使用 nginx 提供静态缓存文件。目录下有 index.html 文件rails_root/public/cache
。我首先尝试了以下配置,但不起作用:
root <%= current_path %>/public;
try_files /cache$uri/index.html /cache$uri.html @rails;
这给出错误:
[error] 4056#0: *13503414 directory index of "(...)current/public/" is forbidden, request: "GET / HTTP/1.1"
然后我尝试
root <%= current_path %>/public/cache;
try_files $uri/index.html $uri.html @rails;
令我惊讶的是,这种方法有效。为什么我可以执行后者,而不能执行前者(因为它们指向相同的位置)
文件系统的权限
文件夹的权限为:
775 public
755 cache
644 index.html
Rails 位于用户~
目录中,因此文件夹和文件都属于用户good
。nginx 的用户是root
master 和http
每个工作处理器的:
89:http 7865 0.1 0.0 8876 2624 ? S Jul10 0:51 nginx: worker process
112:root 24927 0.0 0.0 8532 1828 ? Ss Jun28 0:03 nginx: master process /usr/sbin/nginx -c /etc/nginx/conf/nginx.conf
我的图标位于 public/ 下,以下图标可正确显示:
# asset server
server {
listen 80;
server_name assets.<%= server_name %>;
expires max;
add_header Cache-Control public;
charset utf-8;
root <%= current_path %>/public;
}
日志
对于我的工作设置:访问日志显示:
request:"GET / HTTP/1.1" 200 uri:"/index.html"
request:"GET /assets/gas/468x15_4.gif HTTP/1.1" 200 uri:"/assets/gas/468x15_4.gif"
如果我添加index nonexistent
相同的目录索引,则会出现禁止错误,并出现以下访问日志:
request:"GET / HTTP/1.1" 403 uri:"/"
错误日志:
directory index of "RAILS_ROOT/current/public/cache/gas/" is forbidden, client: _IP_, server: example.com, request: "GET / HTTP/1.1", host: "gas.example.com"
更新
请参阅完整配置文件。请注意,它是完整的,并且上面给出的示例有点简化。
我正在使用 Nginx 1.22
答案1
问题出在块if
中的指令上location
。这些指令只显示在完整配置文件中(对于那些试图解决这个问题的人,我深表歉意)。一旦我将它们移至server
块级别,它就可以正常工作了。
directory index of *** is forbidden
location
表示位置块中没有可用的内容指令。在这种情况下,嵌套 location
块,在块if
中使用指令时创建location
。
if
块级指令server
不存在这个问题。我的if
s 可以移动,并且仍能正常工作,但我不确定if
如果移动,哪些 s 会无法正常工作。
因此在这种情况下文件权限可能不太重要。
@Vbart 说得对if 是邪恶的。
答案2
我认为指数应该在 NGX_HTTP_ACCESS_PHASE 附近的 try_files 之前进行处理,因为日志表明您正在请求目录。
正确的方法是向官方邮件列表提出这个问题。