如何将此 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 的静态 gzip4) 更新站点可用的配置文件:
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?的主要内容,如果未能解决你的问题,请参考以下文章