0

我直接使用 Rails 和 Nginx(没有 apache),想知道我的虚拟主机中是否需要以下内容:

        # serve static content directly
        location ~* \.(ico|jpg|gif|png|css|js|swf|html)$ {
          if (-f $request_filename) {
            expires max;
            break;
          }
        }

如果我不使用 Apache,它是否相关?

提前致谢。

4

3 回答 3

2

由于您使用的是 Rails,因此您需要的唯一配置可能只是:

server {
    listen 80;
    server_name example.com;

    location / {
        root path/to/static/files;
        try_files $uri @rails;
        expires max;
    }

    location @rails {
        # proxy_pass to gunicorn or whatever...
    }
}

但最好将所有媒体文件保存在单独的目录中:

server {
    listen 80;
    server_name example.org;

    location / {
        # proxy_pass to gunicorn or whatever...
    }

    location /media/ {
        root path/to/static/files;
        try_files $uri @rails;
        expires max;
    }
}

留下丑陋而复杂的规则,例如:

location ~* \.(ico|jpg|gif|png|css|js|swf|html)$`

给 PHP 人。他们的项目中通常有一堆乱七八糟的代码和媒体,喜欢在 Web 服务器配置中编程,而不是在应用程序中执行所有应用程序逻辑。

于 2013-02-22T12:22:23.647 回答
1

该指令告诉nginxexpires标头设置为最大可能值,并在请求的文件以这些扩展名之一结尾并且存在时停止处理进一步的指令。这些文件将由 nginx 提供。无论您是否使用 apache,这都是有效的指令。您不必使用它,但最好这样做,因为 nginx 非常擅长提供静态文件。

更新

正如其他人指出的那样,您应该避免使用if. 您可以通过以下方式做到这一点:

location ~* \.(ico|jpg|gif|png|css|js|swf|html)$ {
    try_files $uri =404;
    expires max;
}

如果要进行特殊处理,请使用命名位置

location ~* \.(ico|jpg|gif|png|css|js|swf|html)$ {
    try_files $uri @process_404;
    expires max;
}

location @process_404{
    # do your stuff
}
于 2013-02-22T00:04:33.657 回答
1

if是没有意义的,只是浪费你的cpu。

从文档:

如果响应代码等于 200、201、204、206、301、302、303、304 或 307,则启用或禁用添加或修改“Expires”和“Cache-Control”响应标头字段。

@http ://nginx.org/r/expires

你在这里看到 404 吗?我不。

停止处理当前的 ngx_http_rewrite_module 指令集。

@http ://nginx.org/r/break

而且我在您的位置没有看到其他重写指令。

于 2013-02-22T09:31:28.357 回答