Bagaimana cara menghapus garis miring ganda pada URL yang dilayani oleh nginx?

9

Saya perlu meniru aturan penulisan ulang Apache berikut di Nginx config pada Ubuntu 12.04. Apa yang setara dengan nginx untuk:

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
codecowboy
sumber
Siapa pun yang menemukan ini online dan mencoba menyalin-menempelkan jawaban yang disarankan, berhati-hatilah jika Anda menggunakan pengaturan Virtualbox dengan port khusus. Saya harus mengubahnya menjadi misalnya di rewrite (.*)//+(.*) $scheme://$host:4321$1/$2 permanent;mana 4321 adalah port eksternal dari Virtualbox'd nginx terhubung dengan browser saya.
aexl

Jawaban:

6

Saya ingin menyarankan pendekatan ini:

# 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;
}

Ia menggunakan perilaku default nginx - penggabungan garis miring, jadi kami tidak perlu mengganti garis miring, kami cukup mengarahkan ulang

ditemukan di sini

SleepWalker
sumber
Ini tidak berfungsi untuk SSL melalui certbot jika Anda memiliki nginx sebagai proxy terbalik via proxy_pass
Jonathan
3

Saya menemukan respons kwo untuk tidak bekerja. Melihat log debug saya, inilah yang terjadi:

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"

Saya menemukan ini bekerja untuk saya:

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

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

DaveQB
sumber
Tautan referensi adalah apa yang perlu Anda periksa. Solusi yang benar ada di sana. Saya akan mencoba mengedit jawabannya.
Anup Nair
1

Coba ini:

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

Mungkin ada beberapa pengalihan untuk garis miring> 3 atau beberapa kelompok garis miring.

kwo
sumber
'merge_slashes off' tidak membuat perbedaan dan tidak menghasilkan perubahan.
Anup Nair
1
Kenapa tidak merge_slashes on;bekerja saja? Apakah nginx buggy?
Jonathan
1
@ Jonathan - Saya baru saja menemukan ini juga. Pemahaman saya, itu merge_slashes ontidak melakukan apa yang Anda pikirkan. Ini pada dasarnya memberitahu nginx untuk mengambil // dan / dan /// sebagai tebasan tunggal (tidak untuk menggabungkan dan mengarahkan sendiri)
Andrew Newby
1

Saya berbicara dari pengalaman menjalankan beberapa server produksi dan server dev untuk sebuah tim. Jangan lakukan ini di nginx. Sebagai gantinya, gunakan router Anda di dalam server aplikasi Anda (JS / PHP dll).

Nginx tidak dapat diandalkan untuk pekerjaan substantif. Misalnya, pengalihan, penulisan ulang, dan ifklausa adalah non-deterministik jika Anda mengubah pengaturan untuk menggunakan SSL, proxy terbalik, port tersembunyi, dan sebagainya. Jadi Anda bisa membuatnya bekerja dengan benar di satu lingkungan, tetapi bisa mustahil untuk bekerja di lingkungan lain.

Tetap menggunakan bahasa pemrograman yang tepat untuk memecahkan masalah, bahkan sesederhana menggabungkan garis miring ganda. Anda akan berterima kasih kepada saya nanti.

Jonathan
sumber
Sementara saya menyetujui pandangan Anda, saya percaya kita harus memberi orang pilihan untuk membentuk pendapat mereka sendiri tentang masalah ini. Saya lebih suka Apache daripada Nginx, dengan alasan yang sama dari Anda. Catatan, Apache mod_rewrite dapat dianggap sebagai bahasa pemrograman yang sederhana juga. :-)
peterh
-1

URL example.com//dir1////dir2///dir3 dan lainnya. Coba ini berfungsi untuk saya

merge_slash off; lokasi ~ ^ (. *?) // + (. *?) $ {return 301 $ 1 / $ 2; }

Sekarang
sumber