Saya menggunakan kode berikut untuk mengarahkan semua permintaan www ke URL non-www:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
Ini berfungsi baik di dalam file .htaccess di root situs web saya.
Misalnya,
www.example.com -> example.com/
www.example.com/ -> example.com/
www.example.com/other_page -> example.com/other_page
Namun, jika saya memindahkan kode yang sama ini ke konfigurasi VirtualHost saya, URL yang ditulis ulang berisi slash trailing ganda.
www.example.com -> example.com//
www.example.com/ -> example.com//
www.example.com/other_page -> example.com//other_page
Saya memperbaikinya dengan menghapus garis miring dari aturan penulisan ulang:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com$1 [R=301,L]
Tapi saya tidak bisa mengerti alasannya. Adakah yang tahu kenapa?
sumber
RewriteRule ^/?(.*)$ http://example.com/$1 [R=301,L]
melakukan trik.Ini terjadi karena Anda menangkap tebasan awal dengan
(.*)
dan kemudian menerapkan garis miring lain sebelum di garis miring yang baru/$1
. Itu tidak terjadi sebelumnya karena mod_rewrite berperilaku sedikit berbeda ketika beroperasi dalam konteks per-direktori yang bertentangan dengan konteks per-server.Anda bisa menghindari ini dengan melakukan pre-empting slash. Selain itu Anda dapat menggunakan RedirectMatch di VirtualHost kosong dengan domain kelebihan Anda, yang membuat pemrosesan lebih sedikit dan dapat terlihat lebih bersih.
sumber
Saya menyertakan posting ini untuk kelengkapan.
The dokumentasi Apache menjelaskan mengapa perilaku ini terjadi sangat baik dan merupakan alasan bahwa 'RewriteBase' direktif ada.
Cukup dengan memasukkan arahan 'RewriteBase' dalam file .htaccess Anda akan mencapai hasil yang Anda inginkan.
Contoh:
Dari dokumentasi Apache 2.2 mod_rewrite:
Aturan praktis saya adalah hampir selalu menggunakan 'RewriteBase' dalam file .htaccess, dan tidak menggunakannya dalam konfigurasi Apache.
sumber
Saya tidak punya waktu untuk menangani masalah ini jadi tulis ulang // ke / :)
sumber