我正在尝试使用 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
用于主处理器和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
我认为应该在 NGX_HTTP_ACCESS_PHASE 附近的 try_files 之前处理索引,因为日志表明您正在请求目录。
正确的方法是用这个问题打官方邮件列表。
问题在于块中的
if
指令location
。这些仅显示在完整的配置文件中(对那些试图在没有配置文件的情况下解决此问题的人表示抱歉)。一旦我将它们移动到server
块级别,它就可以正常工作。directory index of *** is forbidden
表示位置块中没有可用的内容指令。在这种情况下,这location
是一个嵌套location
块,在块if
中使用指令时创建location
。if
块级下的指令server
没有这个问题。我if
的 s 可以移动并且仍然可以正常工作,但我不确定if
如果移动什么 s 将无法工作。所以在这种情况下,文件权限可能不太相关。
@Vbart 说if is evil是正确的。