Apache2 - 301 Redirect ketika hilang "/" di akhir direktori di url

13

Saya belum benar-benar memperhatikan Pengalihan ini (301) ketika meminta url seperti ini tanpa garis miring ("/") di akhir: http://server/directory

Server akan merespons dengan tajuk 301 Redirect Permanent dengan tajuk Lokasi http://server/directory/.

Lihat contoh langsung ini:

Permintaan pengguna:

GET /social HTTP/1.1
( http://192.168.1.111/social )

Respon Server Apache:

HTTP/1.1 301 Moved Permanently
Location: http://192.168.1.111/social/

Permintaan pengguna:

GET /social/ HTTP/1.1
( http://192.168.1.111/social/ )

Respon Server Apache:

HTTP/1.1 200 OK

Apache access.log:

192.168.1.130 - - [05/Apr/2014:22:06:47 +0200] "GET /social HTTP/1.1" 301 558 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"
-
192.168.1.130 - - [05/Apr/2014:22:06:47 +0200] "GET /social/ HTTP/1.1" 200 942 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"

Direktori / social / berisi index.htmlfile.

Perangkat Lunak Apache: Apache/2.2.22 (Ubuntu)
Opsi Direktori:Options Indexes FollowSymLinks MultiViews

Jadi, pertanyaan saya adalah: Mengapa apache melakukan ini? Dan bagaimana cara mencegah pengalihan dan mengirimkan index.htmllangsung? Klien harus mengirim dua permintaan yang sebenarnya tidak perlu. Dan mungkin beberapa klien tidak mengizinkan Pengalihan dan tidak akan dapat pergi ke situs tanpa garis miring ("/").

Saya tidak ingin menonaktifkan pengalihan. Saya tidak ingin server untuk mengirimkan respons secara langsung tanpa arahan ulang. Bahkan saat meminta /social.

Apakah apache dirancang untuk mengarahkan permintaan itu? Server bisa saja mengirim data tanpa mengarahkan ulang, kan? Haruskah saya menggunakan mod_rewriteuntuk mencegah ini? Atau konfigurasi lain? Atau haruskah saya membiarkannya seperti ini dan menambahkan garis miring di akhir semua tautan html dan hidup dengan beberapa arahan ulang?

apa yang kalian pikirkan?

Jonathan Gurebo
sumber
Saya pikir Anda harus mengklarifikasi mengapa Anda ingin menonaktifkan ini. Satu-satunya alternatif yang waras untuk pengalihan akan merespons dengan 404 untuk /socialdalam contoh Anda.
Håkan Lindqvist
Saya tidak ingin menonaktifkannya, hanya mencegah pengalihan. Saya ingin server untuk mengeluarkan index.htmltanpa redirect
Jonathan Gurebo
Dengan "ini" saya merujuk pada perilaku normal dengan pengalihan dari url yang salah ke url yang benar. Lihat jawaban dari @kasperd untuk beberapa alasan mengapa itu akan menjadi ide yang buruk untuk menyajikan konten dari misalnya /social. (Selain itu, secara umum, menyajikan konten yang sama di beberapa url biasanya tidak diinginkan.)
Håkan Lindqvist

Jawaban:

10

Mengirim data tanpa redirect akan memutus tautan relatif. Jika http://server/directoryberisi file, maka URL lengkap untuk itu adalah http://server/directory/file. Tautan yang ditentukan seperti <a href="file">akan menunjukkan http://server/directory/fileapakah URL dasar adalah http://server/directory/, tetapi jika URL dasar hanya http://server/directoryitu yang akan menunjuk http://server/file, bukan hasil yang diinginkan.

Apache dapat membuat daftar direktori dengan dua cara berbeda tergantung pada URL alih-alih pengarahan ulang. Namun itu tidak akan berfungsi jika ada index.htmlfile di direktori. Jadi, bukannya Apache menggunakan pendekatan, yang bekerja dalam kedua kasus.

Ini bukan perilaku baru, satu dekade lalu Apache berperilaku dengan cara yang sama. Klien yang tidak dapat menangani pengalihan seharusnya sudah diperbaiki sekarang. Tetapi untuk setiap klien yang tidak dapat menangani pengalihan, Apache harus mengirimkan file html kecil dengan tautan yang bisa diikuti.

kasperd
sumber
Ini tidak menjawab pertanyaan. Benar, bahwa tautan relatif mungkin rusak. Tetapi jika seseorang ingin mengirimkan konten untuk jalur tanpa garis miring, maka mereka mungkin memiliki resaons untuk itu, misalnya ketika permintaan POST dikirim ke layanan web. Tidak ada tautan relatif di layanan web, dan pengalihan akan menyebabkan badan POST hilang.
dr fu manchu
9

mod_dirmenambahkan pengalihan ini, dan Anda dapat menonaktifkannya dengan DirectorySlash Offarahan.

Namun, perhatikan bahwa menonaktifkan trailing slash redirect dapat menyebabkan beberapa halaman rusak. Jika halaman yang dikembalikan berisi tautan relatif, maka URL-URL itu akan menyelesaikan secara berbeda jika halaman disajikan tanpa garis miring.

200_sukses
sumber