仅当根目录是 public 下的子文件夹时,静态文件服务才有效

仅当根目录是 public 下的子文件夹时,静态文件服务才有效

我正在尝试使用 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 的用户是rootmaster 和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 forbiddenlocation表示位置块中没有可用的内容指令。在这种情况下,嵌套 location块,在块if中使用指令时创建location

if块级指令server不存在这个问题。我的ifs 可以移动,并且仍能正常工作,但我不确定if如果移动,哪些 s 会无法正常工作。

因此在这种情况下文件权限可能不太重要。

@Vbart 说得对if 是邪恶的

答案2

我认为指数应该在 NGX_HTTP_ACCESS_PHASE 附近的 try_files 之前进行处理,因为日志表明您正在请求目录。

正确的方法是向官方邮件列表提出这个问题。

相关内容