首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的Nginx别名指令不起作用?

问为什么我的Nginx别名指令不起作用?
EN

Server Fault用户
提问于 2018-05-11 19:30:28
回答 1查看 1.3K关注 0票数 1

我在CentOS 7上使用Nginx和/ Puma。我希望某些文件路径被RoR跳过,由Nginx直接提供。我在我的“服务器”块中为我的站点创建了这个

代码语言:javascript
复制
location /assets/lib/ {
    alias /home/rails/myproject_production/app/assets/javascripts/lib/;
    autoindex off;
}

然而,当我调用像http://www.mydomein.com/assets/lib/myfile.js这样的资产时,我会得到一个404。这就是我的日志

代码语言:javascript
复制
2018/05/11 15:21:47 [error] 242#0: *1 open() "/home/rails/myproject_production/public/assets/lib/myfile.js" failed (2: No such file or directory), client: 50.240.135.5, server: www.mydomein.com, request: "GET /assets/lib/myfile.js HTTP/1.1", host: "www.mydomein.com"

从日志中,似乎根本没有调用别名。我在上面遗漏了什么?我的完整配置如下

代码语言:javascript
复制
upstream myproject {
  server unix:///home/rails/myproject_production/shared/sockets/puma.sock;
}

# Listener for Apex Domain
server {
  listen 80;
  server_name www.mydomein.com;
  root /home/rails/myproject_production/public; # I assume your app is located at this location

  location / {
    proxy_pass http://myproject; # match the name of upstream directive which is defined above
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    if ($request_uri ~* "(\/image\/.*)|(.*\.(ico|gif|jpe?g|png)$)") {
      expires 60d;
      access_log off;
      add_header Pragma public;
      add_header Cache-Control "public";
      break;
    }
  }

  location /assets/lib/ {
        alias /home/rails/myproject_production/app/assets/javascripts/lib/;
        autoindex off;
  }

  location /cable {
    proxy_pass http://myproject;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }

  location ~* ^/assets/ {
    # Per RFC2616 - 1 year maximum expiry
    expires 1y;
    add_header Cache-Control public;

    # Some browsers still send conditional-GET requests if there's a
    # Last-Modified header or an ETag header even if they haven't
    # reached the expiry date sent in the Expires header.
    add_header Last-Modified "";
    add_header ETag "";
    break;
  }

}
EN

回答 1

Server Fault用户

回答已采纳

发布于 2018-05-11 19:45:33

您有两个location块:

代码语言:javascript
复制
location /assets/lib/ {
  …
}
location ~* ^/assets/ {
  …
}

现在,正如在Nginx 文档中所描述的,Nginx检查第一个前缀位置,并记住最长的匹配。然后检查正则表达式位置,如果找到匹配块,则使用匹配块。如果没有找到,则使用前缀匹配。

因此,在您的例子中,nginx首先找到第一个location块,记住它。但是,正则表达式块也匹配,nginx选择该块。

为了更改nginx选择过程,您需要使用:

代码语言:javascript
复制
location ^~ /assets/lib {
  …
}

你的第一个位置。这也意味着正则表达式块中的指令不应用于这些请求。

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/911831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档