如何删除Nginx服务的URL中的双斜杠?


9

我需要在Ubuntu 12.04的Nginx配置中复制以下Apache重写规则。什么是nginx等效于:

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]


谁在网上找到此文件并尝试复制并粘贴建议的答案,请注意,如果您使用的是带有自定义端口的Virtualbox设置。我不得不改变它是如rewrite (.*)//+(.*) $scheme://$host:4321$1/$2 permanent;其中4321是Virtualbox'd的外部端口nginx的我的浏览器连接到。
aexl

Answers:


6

我想建议这种方法:

# remove multiple sequences of forward slashes
# rewrite URI has duplicate slashes already removed by Nginx (merge_slashes on), just need to rewrite back to current location
# note: the use of "^[^?]*?" avoids matches in querystring portion which would cause an infinite redirect loop
if ($request_uri ~ "^[^?]*?//") {
rewrite "^" $scheme://$host$uri permanent;
}

它使用nginx的默认行为-合并斜杠,因此我们不需要替换斜杠,我们只需重定向

在这里找到



如果您通过以下方式将nginx作为反向代理,则无法通过certbot使用SSL: proxy_pass
Jonathan

3

我发现kwo的回应不起作用。查看我的调试日志,将发生以下情况:

2014/08/18 15:51:04 [debug] 16361#0: *1 http script regex: "(.*)//+(.*)"
2014/08/18 15:51:04 [notice] 16361#0: *1 "(.*)//+(.*)" does not match "/contact-us/", client: 59.167.230.186, server: *.domain.edu, request: "GET //////contact-us//// HTTP/1.1", host: 
"test.domain.edu"

我发现这对我有用:

if ($request_uri ~* "\/\/") {
  rewrite ^/(.*)      $scheme://$host/$1    permanent;
}

参考:http : //rosslawley.co.uk/archive/old/2010/01/10/nginx-how-to-url-cleaning-removing/


参考链接是您需要检查的。正确的解决方案在那里。我将尝试编辑答案。
Anup Nair

1

尝试这个:

merge_slashes off;
rewrite (.*)//+(.*) $1/$2 permanent;

对于斜线> 3或多组斜线,可能会有多个重定向。


'merge_slashes off'没什么区别,也没有改变。
Anup Nair

1
为什么不merge_slashes on;工作?Nginx越野车吗?
乔纳森

1
@Jonathan-我也刚遇到这个问题。我的理解是,merge_slashes on这不符合您的想法。它基本上告诉nginx将//和/和///当作一个斜杠(而不是自己合并和重定向)
Andrew Newby

1

我从为团队运行多个生产服务器和开发服务器的经验谈起。不要在nginx中这样做。相反,请在应用程序服务器(JS / PHP等)中使用路由器。

Nginx对于实质性工作不可靠。例如,if如果将设置更改为使用SSL,反向代理,隐藏端口等,则重定向,重写和子句是不确定的。因此,您可能会使其在一种环境中正常工作,但在另一种环境中可能无法工作。

坚持使用适当的编程语言来解决问题,甚至像合并双斜杠一样简单。待会儿我会谢谢你的。


在我同意你的观点的同时,我相信我们应该让人们有选择地就此事发表自己的看法。我比Nginx更喜欢Apache,原因与您相同。注意,Apache mod_rewrite也可以被视为一种简单的编程语言。:-)
peterh-恢复莫妮卡


-1

网址example.com//dir1/////dir2///dir3等,请尝试一下,它对我有用

merge_slashes关闭;location〜^(。*?)// +(。*?)$ {返回301 $ 1 / $ 2; }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.