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のnginxの外部ポートであるように変更する必要がありました。
aexl 2017年

回答:


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 2018

1

これを試して:

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

スラッシュが3を超える場合は複数のリダイレクトがあり、スラッシュのグループが複数ある場合があります。


'merge_slashes off'は違いをもたらさず、変更はありませんでした。
Anup Nair 2018

1
なぜうまくいかないのmerge_slashes on;ですか?nginxはバギーですか?
ジョナサン

1
@ジョナサン-私もこれに出くわしました。私の理解では、それmerge_slashes onはあなたが考えていることをしていません。それは基本的にnginxに//と/と///を単一のスラッシュとしてとるように指示します(単独でマージしてリダイレクトしないでください)
Andrew Newby

1

チームで複数の本番サーバーと開発サーバーを実行した経験から話します。nginxではこれを行わないでください。代わりに、アプリケーションサーバー(JS / PHPなど)内でルーターを使用します。

Nginxは実質的な作業には信頼できません。たとえば、ifSSL、リバースプロキシ、隠しポートなどを使用するように設定を変更した場合、リダイレクト、書き換え、句は非決定的です。したがって、ある環境では正しく機能する可能性がありますが、別の環境では機能しない可能性があります。

ダブルスラッシュをマージするのと同じくらい簡単でも、問題を解決するための適切なプログラミング言語に固執してください。後で私に感謝します。


私はあなたの意見に同意しますが、私たちは人々に問題について自分の意見を形成するオプションを与えるべきだと信じています。私はあなたと同じ理由でNginxよりもApacheを好みます。Apache mod_rewriteも単純なプログラミング言語と見なすことができます。:-)
peterh-モニカを


-1

URL example.com//dir1////dir2///dir3 and moreこれを試してみてください

merge_slashes off; 場所〜^(。*?)// +(。*?)$ {return 301 $ 1 / $ 2; }

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.