如何将此 apache 重写转换为 nginx?

Posted

技术标签:

【中文标题】如何将此 apache 重写转换为 nginx?【英文标题】:How to convert this apache rewrite into 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 不支持自定义文件名?

【问题讨论】:

【参考方案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 开发工具中的监视器选项卡以查看文件大小曾是。如果您想使用更多技术,请在此处查看接受的答案:***.com/questions/2460821/… @RobertNoack 您还可以检查浏览器控制台:“网络”选项卡,单击应该压缩的文件之一,然后在“响应标头”中,您应该阅读“内容编码:gzip "(重新加载页面时可能无法显示,因为浏览器将使用缓存文件) 关于乔迪的回答,而不是重命名文件,只需对它们进行符号链接。那么您不必为每个构建都这样做。

以上是关于如何将此 apache 重写转换为 nginx?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 nginx 中转换(重写)部分 URL

Nginx 中的多站点 WordPress 重写规则

Nginx 将子域转换为路径组件而不进行重定向

如何在 Apache 2.4 中重定向 /path/variables/ 以重写为 /index.php/path/variables/?

Nginx RegEx 对多个站点进行重写或内部重定向循环

如何将此 Java 代码转换为 kotlin 代码