Mengapa RewriteRule untuk “^ // (. *)” (Dimulai dengan garis miring ganda) tidak dialihkan ke garis miring tunggal?

Aug 17 2020

Miliki aturan penulisan ulang ini dalam konteks vHost. Tapi itu tidak menulis ulang permintaan yang dimulai dengan //.*(garis miring ganda). Hanya menyajikannya dari /.*(garis miring tunggal) alih-alih merespons dengan pengalihan ke/.*

RewriteRule "^//(.*)" "/$1" [R=301,L]

Mengapa ini tidak berhasil?

Jawaban

2 MrWhite Aug 18 2020 at 06:51
RewriteRule "^//(.*)" "/$1" [R=301,L]

Ini tidak akan pernah cocok karena jalur URL tempat RewriteRule pola cocok dengan semua contoh beberapa garis miring yang dikurangi menjadi satu garis miring.

Untuk mengalihkan permintaan seperti itu, Anda dapat menggunakan "fitur" ini dan cukup mengalihkan "ke dirinya sendiri" dan memeriksa THE_REQUESTvariabel server sebagai gantinya untuk menentukan apakah ada beberapa garis miring pada permintaan awal. THE_REQUESTadalah baris pertama dari header permintaan dan berisi URL permintaan mentah yang belum diproses (tidak termasuk protokol dan nama host, tetapi termasuk string kueri) seperti yang dikirim dari klien.

Misalnya, untuk mengarahkan semua contoh dari beberapa garis miring ke satu garis miring di seluruh jalur URL, tidak hanya di awal maka Anda dapat melakukan sesuatu seperti ini:

RewriteCond %{THE_REQUEST} \s[^?]*//
RewriteRule (.*) $1 [R=301,L]

Regex \s[^?]*//memastikan kami tidak mencocokkan beberapa garis miring di bagian string kueri dari URL (yang jika tidak akan menghasilkan loop pengalihan).


Akankah RewriteCond %{THE_REQUEST} ^//memungkinkan kita untuk menerapkan aturan penulisan ulang hanya untuk yang dimulai dengan garis miring ganda, mengabaikan semua contoh garis miring ganda lainnya?

Kurang tepat, THE_REQUESTvariabel server sebenarnya berisi seluruh baris pertama dari header permintaan HTTP. Dengan kata lain, rangkaian bentuk:

GET /foo/bar.html HTTP/1.1

Atau GET //foo/bar.html HTTP/1.1jika ada garis miring ganda di awal jalur URL, jadi Anda memerlukan sesuatu seperti ini:

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

... untuk menangkap semua metode permintaan. Dan secara khusus hanya garis miring ganda, bukan garis miring tiga, dll di awal jalur URL saja.

\s//[^/]- Itu adalah spasi (setelah metode permintaan ) diikuti oleh 2 garis miring dan sesuatu selain garis miring (misalnya, spasi untuk root dokumen, atau beberapa jalur URL lainnya).