【问题标题】:How to convert this apache rewrite into nginx?如何将此 apache 重写转换为 nginx?
【发布时间】:2015-02-19 01:45:31
【问题描述】:

以下是unity webgl的apache重写规则

Options +FollowSymLinks
RewriteEngine on

RewriteCond %{HTTP:Accept-encoding} gzip
RewriteRule (.*)Data(.*)\.js $1Compressed$2\.jsgz [L]
RewriteRule (.*)Data(.*)\.data $1Compressed$2\.datagz [L]
RewriteRule (.*)Data(.*)\.mem $1Compressed$2\.memgz [L]
RewriteRule (.*)Data(.*)\.unity3d $1Compressed$2\.unity3dgz [L]
AddEncoding gzip .jsgz
AddEncoding gzip .datagz
AddEncoding gzip .memgz
AddEncoding gzip .unity3dgz

目前在 nginx 上我有以下内容

   location ~* \.(js|data|mem|unity3d)$
   {
   gzip_static on;

   if ($request_filename ~ "\.jsgz$" ) {
                rewrite ^(.js.gz)$ /$1.jsgz;
   }
   if ($request_filename ~ "\.datagz$" ) {
                rewrite ^(.data.gz)$ /$1.datagz;
   }
   if ($request_filename ~ "\.memgz$" ) {
                rewrite ^(.mem.gz)$ /$1.memgz;
   }
   if ($request_filename ~ "\.unity3dgz$" ) {
                rewrite ^(.unity3d.gz)$ /$1.unity3dgz;
   }
   }



   location ~* \.(jsgz|datagz|memgz|unity3dgz)$ {
   add_header Content-Encoding gzip;
   break;
   }

但是不行,根据我对原apache重写的理解,假设自动将js|data|mem|unity3d压缩成gunzip格式,并在文件名末尾加上“gz”名称,如何重写在 nginx 中,而 gzip_static 不支持自定义文件名?

【问题讨论】:

    标签: apache .htaccess nginx


    【解决方案1】:

    如何在 5.5 上做到这一点:

    1) 转到 Release 文件夹并将所有以 .extensiongz 结尾的文件扩展名重命名为 .extension.gz

    2) 确保您的文件中没有任何空格,我总是留下我的蛇形盒

    3) 运行 nginx -V

    确保你已经安装了 nginx 的静态 gzip

    4) 更新站点可用的配置文件:

    location ~* {
            gzip_static on;
    }
    

    5) 使用 sudo service nginx restart

    重启 nginx

    【讨论】:

      【解决方案2】:

      这是我的解决方案。我在 nginx/1.2.1 上测试过。

      location ~* ^/new/build/webgl_build/Release/.+\.(js|data|mem|unity3d) {
          add_header Content-Encoding gzip;
          gzip_static on;
      
          rewrite (.*)Release(.*)\.js $1Compressed$2.jsgz break;
          rewrite (.*)Release(.*)\.data $1Compressed$2.datagz break;
          rewrite (.*)Release(.*)\.mem $1Compressed$2.memgz break;
          rewrite (.*)Release(.*)\.unity3d $1Compressed$2.unity3dgz break;
      }
      

      希望对你有所帮助。 :)

      【讨论】:

        【解决方案3】:

        使用 http://winginx.com/en/htaccess 自动转换 Unity 的 .htaccess 会产生以下结果:

        # nginx configuration
        location / {
          rewrite (.*)Data(.*)\.js /$1Compressed$2\.jsgz break;
          rewrite (.*)Data(.*)\.data /$1Compressed$2\.datagz break;
          rewrite (.*)Data(.*)\.mem /$1Compressed$2\.memgz break;
          rewrite (.*)Data(.*)\.unity3d /$1Compressed$2\.unity3dgz break;
        }
        

        【讨论】:

          【解决方案4】:

          您现在可能已经想通了,但是我自己在 Apache 到 Nginx 的转换过程中遇到了这个问题。

          Nginx 有一个名为 gzip_static 的模块,如果客户端支持 gzip,它将自动查找文件的预压缩版本并提供它们。这要求您将文件从 Compressed 目录移动到 Data 目录,并稍微更改文件扩展名:

          之前:

          # cd MyProject
          # tree
          .
          |-- Compressed
          |   |-- MyProject.datagz
          |   |-- MyProject.html.memgz
          |   |-- MyProject.jsgz
          |   |-- fileloader.jsgz
          |   |-- UnityConfig.jsgz
          |   |-- UnityProgress.jsgz
          |-- Data
          |   |-- MyProject.data
          |   |-- MyProject.html.mem
          |   |-- MyProject.js
          |   |-- fileloader.js
          |   |-- UnityConfig.js
          |   |-- UnityProgress.js
          

          之后:

          # tree
          .
          |-- Compressed
          |-- Data
          |   |-- MyProject.data
          |   |-- MyProject.data.gz
          |   |-- MyProject.html.mem
          |   |-- MyProject.html.mem.gz
          |   |-- MyProject.js
          |   |-- MyProject.js.gz
          |   |-- fileloader.js
          |   |-- fileloader.js.gz
          |   |-- UnityConfig.js
          |   |-- UnityConfig.js.gz
          |   |-- UnityProgress.js
          |   |-- UnityProgress.js.gz
          

          在您的 Nginx 配置中:

          location /path/to/MyProject/Data {
              gzip_static on;
          }
          

          请注意,Nginx 必须使用 --with-http_gzip_static_module 构建。你可以通过运行来检查你的版本是否已经有这个:

          nginx -V
          

          唯一的缺点是您必须移动/重命名文件,但这对于单行解决方案来说是一个小小的不便。

          以下是如何移动/重命名 gzip 文件以匹配 nginx 的期望:

          cd Data
          mv ../Compressed/*gz ./
          rename 's/(.*)gz$/$1.gz/' *gz
          

          【讨论】:

          • 有没有简单的方法来判断这是否真的有效?我做了这里描述的所有事情,这对我来说很有意义,gzip 已启用并安装在 nginx 中,但似乎下载时间过长/下载完整版而不是压缩版。
          • 为了自己测试,我只是查看了压缩和未压缩文件的文件大小,清除了浏览器缓存,然后查看了 chrome/firefox 开发工具中的监视器选项卡以查看文件大小曾是。如果您想使用更多技术,请在此处查看接受的答案:stackoverflow.com/questions/2460821/…
          • @RobertNoack 您还可以检查浏览器控制台:“网络”选项卡,单击应该压缩的文件之一,然后在“响应标头”中,您应该阅读“内容编码:gzip "(重新加载页面时可能无法显示,因为浏览器将使用缓存文件)
          • 关于乔迪的回答,而不是重命名文件,只需对它们进行符号链接。那么您不必为每个构建都这样做。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-06
          • 2016-06-18
          • 2014-11-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多