Saya mencoba mengalihkan url tanpa www. ke www.version (example.com ke www.example.com). Saya menggunakan yang biasa
RewriteCond %{HTTP_HOST} ^example\.com [nc]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
Ini bekerja pada semua proyek saya yang lain. Namun di situs khusus ini, itu berakhir dengan perulangan pengalihan. Inilah bagian yang aneh: Saya mencoba untuk menggulung versi non-www untuk melihat header yang dikirim menggunakan
curl --get http://example.com --dump-header domain.header > domain.html
. File header terlihat seperti ini:
HTTP/1.1 301 Moved Permanently
Date: Mon, 06 Jun 2011 14:45:16 GMT
Server: Apache/2.2.16 (Debian)
Location: http://example.com/
Vary: Accept-Encoding
Content-Length: 310
Content-Type: text/html; charset=iso-8859-1
Namun, file HTML yang dihasilkan adalah ini:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.example.com/">here</a>.</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at example.com Port 80</address>
</body></html>
(perhatikan perbedaan alamat antara file-file tersebut) Apakah ada yang tahu bagaimana cara memperbaikinya (dan apa yang menyebabkannya)? Arahan penulisan ulang url lainnya berfungsi dengan baik.
Sunting: menulis ulang log berisi ini: (situs diakses oleh banyak orang sehingga penulisan ulang log menjadi cukup lama, saya tidak 100% yakin apakah ini bagian yang tepat)
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] strip per-dir prefix: /var/www/oup/81/ ->
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] applying pattern '(.*)' to uri ''
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] rewrite '' -> 'http://www.example.com/'
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] explicitly forcing redirect with http://www.example.com/
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] escaping http://www.example.com/ for redirect
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] redirect to http://www.example.com/ [REDIRECT/301]
Jalur akses log (mungkin yang benar):
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] "GET / HTTP/1.1" 301 555 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.77 Safari/534.24"
Definisi dari virtualhost:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName example.com
ServerAlias example.com www.example.com
DocumentRoot /var/www/example/
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/example/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride All
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
EDIT2: oke, saya baru tahu bahwa jika saya melakukan ini (mengundurkan diri dan mencoba untuk mengarahkan ini tanpa .htaccess):
//if clause determining that we're running on example.com and not www.example.com
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.example.com' . $_SERVER['REQUEST_URI']);
header('Connection: close');
Ini menyebabkan PERSIS loop berulang SAMA SAMA . Serius, apa-apaan ini? Adakah yang tahu apa yang menyebabkan ini?
Jawaban:
Apa yang menurut saya aneh adalah
Location: http://domain.cz/
baris tajuk yang dilaporkan oleh CURL. Anda tidak pernah mengalihkan ke domain itu. Log redirect juga tidak mengandung menyebutkannya.Entah bagaimana
Location
tajuk itu tampaknya diubah setelah modrewrite melakukan tugasnya, dan karena Anda juga mencoba mengubah tajuk dengan PHP,Location
tajuk itu tampaknya diubah setelah permintaan diproses. Satu-satunya penjelasan yang dapat saya pikirkan adalah bahwa Anda memodifikasi header lokasi dengan mod_header di suatu tempat.Apakah Anda memeriksa semua file konfigurasi (httpd.conf, file .conf yang disertakan, dan file .htaccess) jika Anda menemukan baris yang mirip dengan ini:
atau
sumber
Selain mengaktifkan rewritelog (jika Anda memiliki akses untuk mengubah httpd.conf) Anda harus menghapus aplikasi yang hidup di situs ini dari persamaan. Hapus / ganti nama sementara index.php default (atau halaman indeks apa pun yang melayani aplikasi Anda) untuk memastikan itu tidak menyebabkan ini.
Ada banyak laporan aplikasi (mis. Wordpress) yang menyebabkan halaman pengalihan default apache ini muncul jika mereka salah konfigurasi.
Juga, periksa sisa konfigurasi apache untuk melihat apakah ada instruksi 'redirect' lain yang mungkin bertentangan.
sumber
Bisakah Anda mencoba kode mod_rewrite alternatif ini:
sumber
Location: http://www.domain.com/
sebagai bagian dari header saya sehingga dalam header kasus dan html saya keduanya menunjukkan domain yang sama yaituwww.domain.com
. Bisakah Anda juga menempelkan Anda baris access.log yang relevan dalam pertanyaan Anda di atas?bisakah Anda mencoba menggunakan [NC] daripada [nc], mungkin sangat sederhana
sumber
Saya harap Anda memiliki akses server, Menambahkan garis pengalihan setelah folder dokumen situs yang ditentukan diikuti
Jika Anda tidak memiliki akses untuk server, tambahkan baris itu di httaccess mulai / ubah bagian.
Mungkin Anda belum menambahkan "RewriteEngine on" sebelum pengalihan.
sumber
RewriteEngine on
, seperti yang saya katakan, ini berfungsi di server lain dengan benar, hanya saja tidak untuk yang ini.Mencoba:
sumber
Pastikan untuk memiliki
Options +FollowSymLinks
jika Anda bekerja dalam konteks direktori.Kalau tidak, jika Anda menggunakan host virtual berbasis nama, coba:
sumber
Setelah membaca semua jawaban Anda dapat memeriksa file de / etc / hosts ... mungkin semua cek Anda dari komputer Anda. Coba akses dari lokasi yang berbeda.
sumber
Saya punya ide kedua. Log server yang Anda poskan menunjukkan alamat "192.168.1.221", yang merupakan alamat dari jaringan lokal. Apakah semua entri log menunjukkan alamat IP yang sama? Jika ini masalahnya, ada proksi antara Anda dan server. Proxy ini mungkin menggunakan
ProxyPassReverse
atauHeader edit
untuk mengubahLocation
tajuk.Ini adalah pengaturan yang biasa untuk menghindari masalah ketika server backend menempatkan nama host sendiri ke dalam
Location
header, bukan nama host dari server proxy eksternal.Jika memang ada server proxy, Anda harus mengubah konfigurasi server proxy daripada konfigurasi server backend, karena proxy akan selalu menimpa informasinya.
Ini berarti bahwa sepanjang waktu kita telah melihat server yang salah: Masalahnya adalah dengan server proxy!
sumber
Bisa jadi karakter yang tidak dapat dicetak seperti null dalam
.htaccess
file.sumber
Saya yakin Anda kehilangan tanda $ setelah kondisi penulisan ulang Anda. Silakan coba:
sumber