.htaccess tidak mengalihkan ke halaman awalan www dengan benar

9

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?

nol
sumber
Apakah Anda mengkompilasi Apache sendiri, atau? Seharusnya tidak mungkin untuk header Lokasi berbeda dari apa yang ada di halaman karena mereka diambil dari variabel yang sama dalam kasus ini, jadi itu cukup aneh. Saya berasumsi bahwa permintaan diteruskan langsung ke Apache, kan, tidak ada server lain yang duduk di antara?
Tim Stone
Saya tidak mengkompilasi apache sendiri dan tidak ada server lain di antaranya.
mungkin server NS Anda tidak dikonfigurasi dengan benar
venimus
4
Tidak perlu mengulangi nama server dalam entri ServerAlias.
chris
dapatkah Anda menaruh semua konten file di sini
dibatalkan

Jawaban:

2

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 Locationtajuk itu tampaknya diubah setelah modrewrite melakukan tugasnya, dan karena Anda juga mencoba mengubah tajuk dengan PHP, Locationtajuk 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:

Header set Location (...)

atau

Header edit Location (...)
Jakob Egger
sumber
Saya belum menemukan yang seperti ini.
2
Apakah Anda langsung terhubung ke Apache, atau ada beberapa caching atau server proxy yang dapat mengubah header? Arahan ProxyPassReverse juga dapat mengubah header lokasi ( httpd.apache.org/docs/2.0/mod/mod_proxy.html#ProxyPassReverse ).
mungkin ada beberapa peralihan proxy, saya akan memeriksanya segera setelah saya mulai bekerja besok.
@Jakob Egger - Saya belum menemukan petunjuk ProxyPassReverse di mana pun.
cypher
1

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.

Gavin C
sumber
Aplikasi ini baik-baik saja, saya mencobanya di server yang berbeda dan domain yang berbeda (menyalin seluruh aplikasi) dan bekerja dengan baik. Saya kira itu adalah sesuatu dalam konfigurasi apache, tapi saya tidak tahu apa.
Aplikasi mungkin ok, tetapi mungkin juga bertentangan dengan pengaturan di server ini . Sepertinya aplikasi Anda sedang dalam produksi sehingga saya dapat melihat bagaimana 'menonaktifkannya' tidak ideal. Untuk bersenang-senang, Anda dapat menambahkan string kueri ke akhir pengalihan sebagai bendera untuk membantu penemuan - jadi / $ 1? Nowww = 1 atau yang serupa.
Gavin C
Tidak, BUKAN dalam produksi.
Oh, keren, maka tidak ada salahnya untuk memindahkan file indeks keluar dari jalan ke 100% mengecualikannya sebagai bagian dari masalah :)
Gavin C
Oh, terkutuk, apa yang saya maksudkan adalah bahwa ini ADALAH dalam produksi, tidak tahu bagaimana hal ini terjadi :-)
0

Bisakah Anda mencoba kode mod_rewrite alternatif ini:

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
anubhava
sumber
Ini gagal dengan cara yang persis sama.
Anda dapat mengaktifkan RewriteLog dan melihat apa yang dimuntahkannya.
anubhava
Dan bagaimana tepatnya saya bisa melakukan itu? :-)
Silakan lihat di sini: httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog Satu-satunya adalah arahan ini masuk ke konfigurasi apache TIDAK di .htaccess.
anubhava
1
Saya menyalin aturan yang sama (seperti jawaban saya di atas) ke instalasi Apache saya dan menjalankan perintah ikal yang sama yang Anda miliki dalam pertanyaan Anda dan mendapatkan Location: http://www.domain.com/sebagai bagian dari header saya sehingga dalam header kasus dan html saya keduanya menunjukkan domain yang sama yaitu www.domain.com. Bisakah Anda juga menempelkan Anda baris access.log yang relevan dalam pertanyaan Anda di atas?
anubhava
0

bisakah Anda mencoba menggunakan [NC] daripada [nc], mungkin sangat sederhana

venimus
sumber
Namun itu bukan :-) (sudah mencoba, tidak berhasil)
0

Saya harap Anda memiliki akses server, Menambahkan garis pengalihan setelah folder dokumen situs yang ditentukan diikuti

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain\.cz [NC]
RewriteRule ^/(.*) http://www.domain.cz/$1 [L,R=301]

Jika Anda tidak memiliki akses untuk server, tambahkan baris itu di httaccess mulai / ubah bagian.

Mungkin Anda belum menambahkan "RewriteEngine on" sebelum pengalihan.


sumber
Saya telah menambahkan RewriteEngine on, seperti yang saya katakan, ini berfungsi di server lain dengan benar, hanya saja tidak untuk yang ini.
AllowOverride Semua mengizinkan dari semua menambahkan baris-baris itu di file konfigurasi server Anda
0

Mencoba:

RewriteCond %{HTTP_HOST} ^domain.cz [NC]
RewriteRule (.*) http://www.domain.cz/$1 [R=301,L]
Shef
sumber
0

Pastikan untuk memiliki Options +FollowSymLinksjika Anda bekerja dalam konteks direktori.

Kalau tidak, jika Anda menggunakan host virtual berbasis nama, coba:

<VirtualHost *:80>
  ServerName domain.cz
  Redirect / http://www.domain.cz/
</VirtualHost>

<VirtualHost *:80>
  ServerName www.domain.cz
  # whatever else
</VirtualHost>
chris
sumber
Saya telah memperbarui pertanyaan dengan definisi VirtualHost.
Apakah Anda mencoba beberapa solusi VirtualHost di atas, atau apakah Anda mulai menggunakan mod_rewrite?
chris
Pada awalnya, saya tidak ingin menggunakan beberapa VirtualHost, tetapi mengingat keadaan saya tetap mencobanya dan itu tidak membantu.
0

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
Tidak, tidak ada di host tentang domain itu.
0

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 ProxyPassReverseatau Header edituntuk mengubah Locationtajuk.

Ini adalah pengaturan yang biasa untuk menghindari masalah ketika server backend menempatkan nama host sendiri ke dalam Locationheader, 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!

Jakob Egger
sumber
Besok saya akan menelepon dukungan teknis dari perusahaan yang menjalankan server ini. Saya pikir itu pasti, saya akan memberi tahu Anda.
cypher
0

Bisa jadi karakter yang tidak dapat dicetak seperti null dalam .htaccessfile.

hexdump -C .htaccess
Charlie
sumber
0

Saya yakin Anda kehilangan tanda $ setelah kondisi penulisan ulang Anda. Silakan coba:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.cz$
RewriteRule ^(.*)$ http://www.domain.cz/$1 [R=301,L]
cormpadre
sumber