nginx 服务页面取决于协议

Posted

技术标签:

【中文标题】nginx 服务页面取决于协议【英文标题】:nginx serve page depending on protocol 【发布时间】:2016-09-04 13:49:51 【问题描述】:

我想同时针对 HTTP/2 和 HTTP/1.x 优化我的网站。对于 HTTP/2(和 SPDY),由于没有额外的请求往返,我想分别提供我的 CSS 和 JS 文件,以获得独立缓存每个文件的好处。但是,如果我只这样做,HTTP/1.x 客户端将遭受额外的往返;所以对他们来说,我想将我的 CSS 和 JS 文件连接起来。

理想情况下,为 HTTP/2 用户提供以下 html

<html>
  <head>
    <link rel="stylesheet" href="stylesheet-1.css">
    <link rel="stylesheet" href="stylesheet-2.css">
  </head>
  <body>
    <script src="script-1.js"></script>
    <script src="script-2.js"></script>
  </body>
</html>

并且 HTTP/1.x 用户将获得此 HTML:

<html>
  <head>
    <link rel="stylesheet" href="all-stylesheets.css">
  </head>
  <body>
    <script src="all-scripts.js"></script>
  </body>
</html>

是否可以根据客户端的协议配置 nginx 以提供不同的 HTML 文件?

【问题讨论】:

【参考方案1】:

是的,您可以通过 $server_protocol 变量执行此操作。我通常建议通过变量扩展插入文件位置。但在这种情况下,我担心这会使您容易受到注入攻击,因为该变量的内容似乎是从请求行逐字复制的。

不过,有一个利用ngx_http_map_module 的解决方案。假设您的网站位于/srv/www

map $server_protocol $version 
    default       "1.1";
    "HTTP/2.0"    "2.0";
    # extra case for any SPDY version
    "~SPDY/"      "2.0";


server 
    listen            [::]:80;
    # The line below requires a working SSL configuration!
    listen            [::]:443 ssl http2;
    server_name       example.com
    root              /srv/www/http-1.1/htdocs;

    location / 
        root          /srv/www/http-$version/htdocs;
        try_files     $uri $uri/ @fallback;
    

    # fallback for HTTP/1.1 files. If this fails as well, we get a 404.
    location @fallback 
        try_files     $uri $uri/ =404;
    

这将为 HTTP/2.0 请求提供 /srv/www/http-2.0/htdocs 之外的所有请求,为所有其他请求提供 /srv/www/http-1.1/htdocs 之外的所有请求。如果找不到专为 HTTP/2.0 设计的资源,则 HTTP/1.1 的对应文件将作为后备。

【讨论】:

@Jackson:好问题。我认为不,SPDY 可能会将自己介绍为例如SPDY/3.1。该映射必须包含SPDY/ 是协议标识符前缀的情况。稍后我会更新我的答案。 @Jackson:我已经更新了我的答案以允许回退。这本质上是一种重复数据删除措施,因此您只需关注专门为 HTTP/2 指定的资源。另外:更好的目录名称。 起初我得到了错误"map" directive is not allowed here,但将map 移出server 块修复了它。之后工作! @Jackson:啊,对。我相应地修正了我的答案。 你确定80端口线是正确的吗?那不应该包括 443 吗?

以上是关于nginx 服务页面取决于协议的主要内容,如果未能解决你的问题,请参考以下文章

nginx常见典型故障

403禁止使用nginx的wordpress索引,其余页面工作正常

Nginx中用IP方式无法访问页面项目

“GIS DICTIONARY A-Z” 查询页面开发—— 基础知识之服务器IP地址域名DNS端口以及Web程序的访问流程

《nginx》二nginx反向代理

《nginx》二nginx反向代理