NginX:将反斜杠重写为正斜杠

时间:2014-11-28 12:58:16

标签: apache mod-rewrite nginx url-rewriting

我想编写NginX重写规则,将所有反斜杠转换为正斜杠。

完全像:Using .htaccess to replace backslash in URL with forward-slash

但是,我在NginX工作,而上面的链接指的是Apache。

我将我的应用程序从Windows IIS迁移到Linux Tomcat,因此我需要完成此操作。 我的网址有多个反斜杠,可以在IE和Chrome中解析,但Firefox会将它们解析为Unicode %5C ,因此我需要重写。

我在WIndows / IIS中的示例网址: https://doman.com/company/。\ images \ company \ companylogo.png

当我将内容移到Linux / Tomcat时,上面的URL适用于Chrome和IE,但Firefox正在将反斜杠转换为%5C 。因此Firefox正试图解决: https://doman.com/company/.%5Cimages%5Ccompany%5Ccompanylogo.png

毋庸置疑,Firefox无法加载图片。

这是我到目前为止在我的nginX配置中尝试过的(一次一个语句)):

rewrite \ / permanent;
rewrite \\ \/ permanent;  # with escaping thinking it might help
rewrite (.*)\(.*)\(.*)\(.*)  $1/$2/$3/$4 permanent;
rewrite (.*)\(.*)\(.*)\(.*)  $1\/$2\/$3\/$4 permanent;

咆哮,似乎没有工作,最后2个语句正在抛出NginX配置错误。

任何指针都会有很大的帮助。有数千个这样的URL,我无法想象将它们全部转换为Forward-Slash'd风格。

1 个答案:

答案 0 :(得分:2)

最后,我自己弄清楚了。

首先,在NginX中, backslash 需要转义两次。 Nginx广泛使用 Lua launguage模块来解析请求。因此,NginX配置解析器以及Lua模块将剥离转义反斜杠。因此需要逃避它两次。

这是错误的: \\

这是正确的: \\\

这部分让我误解了2天,因为我按照典型的PCRE标准转义字符,而NginX会给我带来正则表达式错误。

此处解释了有关此行为的更多信息:http://wiki.nginx.org/HttpLuaModule#Special_PCRE_Sequences

现在,问我的问题:

来源网址:https://domain.com/company/。\ images \ company \ companylogo.png

重定向的网址:https://domain.com/company/./images/company/companylogo.png

我想将上述网址中的所有\转换为/。因此,为此目的,需要rewrite以下规则:

rewrite ^/(.+)\\\(.+)\\\(.+)\\\(.+)$ /$1/$2/$3/$4 redirect;

以上规则将执行单个重定向(HTTP代码302),并将所有三个\转换为/

但是,如果您在网址中有\个不同的数量,则上述规则可能(不)有效。因此,在这种情况下,请使用以下规则将ALL \转换为/

rewrite ^/(.+)\\\(.+)$ /$1/$2 redirect;

请注意,根据上述规则,将发生多个重定向(HTTP代码302),从而导致一些延迟。重定向的数量将等于源URL中的\的数量。这也适用于我的URL。但是它会完成重定向3次(因为我的URL中有3个反斜杠)。所以,我对上面提到的第一条规则很好。

尽管如此,我一直都有很好的学习,现在我更了解NginX。

以下是帮助解决此问题的少数(数百个)链接:

http://wiki.nginx.org/HttpLuaModule

https://blog.engineyard.com/2011/useful-rewrites-for-nginx

http://nginx.org/en/docs/http/ngx_http_core_module.html#location

http://blog.rackcorp.com/2010/05/nginx-location-and-rewrite-configuration-made-easy/

http://www.cyberciti.biz/faq/unix-linux-bsd-nginx-redirect-url-http-301-status-code/