.htaccess, www ön ekli sayfaya düzgün bir şekilde yönlendirmiyor


9

Bir URL'yi www olmadan yönlendirmeye çalışıyorum. www.version (example.com'dan www.example.com'a). Olağan kullanıyorum

RewriteCond %{HTTP_HOST} ^example\.com [nc]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

Bu, diğer tüm projelerimde işe yarar. Ancak bu belirli sitede bir yönlendirme döngüsü ile bitiyor. İşte garip kısmı: Hangi başlıkları kullanarak gönderdiğini görmek için www olmayan sürümü kıvırmaya çalıştım curl --get http://example.com --dump-header domain.header > domain.html. Başlık dosyası şöyle görünüyordu:

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

Ancak, ortaya çıkan HTML dosyası şuydu:

<!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>

(dosyalar arasındaki adres farkını not edin) Herkes bunu nasıl düzeltebileceğini biliyor mu (ve buna ne neden oluyor)? Diğer url yeniden yazma yönergeleri sorunsuz çalışır.

DÜZENLEME: yeniden yazma günlüğü bunu içeriyordu: (siteye birçok kişi tarafından erişildi, bu yüzden yeniden yazma günlüğü oldukça uzadı, bu doğru parça ise% 100 emin değilim)

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]

Erişim günlüğü satırı (muhtemelen doğru olanı):

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"

Sanal ana makinenin tanımı:

<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: tamam, ben sadece bunu (eğer istifa ve bunu .htaccess olmadan yönlendirmeye çalıştı) eğer anladım:

//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');

Tam olarak aynı yönlendirme döngüsüne neden olur . Cidden, ne oluyor? Herkesin buna neden olabileceği hakkında bir fikri var mı?


Apache'yi kendiniz mi derlediniz? Konum üstbilgisinin, bu durumda aynı değişkenten alındığı için sayfadakilerden farklı olması imkansız olmalıdır, bu yüzden bu oldukça garip. İsteklerin doğrudan Apache'ye aktarıldığını varsayalım, değil mi?
Tim Stone

Apache'yi kendim derlemedim ve aralarında başka bir sunucu yok.

muhtemelen NS sunucunuz düzgün yapılandırılmamış
venimus

4
Sunucu adını ServerAlias ​​girdisinde tekrarlamanız gerekmez.
chris

dosyanın tüm içeriğini buraya koyabilir misiniz
geri alınır

Yanıtlar:


2

Beni tuhaf yapan şey, Location: http://domain.cz/CURL tarafından bildirilen başlık satırı. Asla o alana yönlendirme yapmazsınız. Yönlendirme günlüğü de bundan bahsedilmez.

Bir şekilde, Locationmodrewrite öğelerini yaptıktan sonra üstbilgi değişmiş gibi görünüyor ve üstbilgiyi PHP ile de değiştirmeyi denediğinizden Location, istek işlendikten sonra üstbilgi değişti. Düşünebildiğim tek açıklama, konum üstbilgisini mod_header ile bir yerde değiştirdiğinizdir.

Şuna benzer bir çizgi bulursanız tüm yapılandırma dosyalarını (httpd.conf, dahil edilen .conf dosyaları ve .htaccess dosyası) kontrol ettiniz mi:

Header set Location (...)

veya

Header edit Location (...)

Böyle bir şey bulamadım.

2
Doğrudan Apache'ye mi bağlanıyorsunuz, yoksa aralarında başlıkları değiştirebilecek bazı önbellekleme veya proxy sunucusu var mı? ProxyPassReverse yönergesi konum başlığını da değiştirebilir ( httpd.apache.org/docs/2.0/mod/mod_proxy.html#ProxyPassReverse ).

aralarında bazı proxyler olabilir, yarın işe başlar başlamaz buna bir göz atacağım.

@ Jakob Egger - ProxyPassReverse yönergesini hiçbir yerde bulamadım.
cypher

1

Yeniden yazmayı etkinleştirmeye ek olarak (httpd.conf dosyasını değiştirmek için erişiminiz varsa), bu sitede yaşayan uygulamayı denklemden kaldırmanız gerekir. Buna neden olmadığından emin olmak için varsayılan index.php'yi (veya uygulamanızın sunduğu herhangi bir dizin sayfası) geçici olarak kaldırın / yeniden adlandırın.

Bu apache varsayılan yönlendirme sayfasının yanlış yapılandırıldıklarında görünmesine neden olan birçok uygulama raporu (örn. Wordpress) vardır.

Ayrıca, çakışan başka bir 'yönlendirme' talimatı olup olmadığını görmek için apache yapılandırmasının geri kalanını kontrol edin.


Uygulama tamam, farklı bir sunucu ve farklı bir alanda denedim (tüm uygulamayı kopyaladı) ve tamam çalıştı. Sanırım bu apache konfigürasyonunda bir şey, ama ne olduğunu anlayamıyorum.

Uygulama iyi olabilir, ancak bu sunucudaki kurulumla da çakışıyor olabilir . Uygulamanız şu anda üretimde gibi görünüyor, bu yüzden 'devre dışı bırakmanın' nasıl ideal olmadığını görebilirsiniz. Eğlenmek için, yeniden yönlendirmenin sonuna keşfe yardımcı olacak bir bayrak olarak bir sorgu dizesi ekleyebilirsiniz - yani / $ 1? Nowww = 1 veya benzeri bir şey.
Gavin C

Hayır, üretimde DEĞİL.

Oh güzel, o zaman dizin dosyasını% 100 sorunun dışına taşımak için zarar veremez :)
Gavin C

Ah, lanet olsun, yazmak istediğim, bu IS'nin üretimde olmasıydı, bunun nasıl gerçekleştiğini bilmiyorum :-)

0

Bu alternatif mod_rewrite kodunu deneyebilir misiniz:

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Bu tam olarak aynı şekilde başarısız oldu.

RewriteLog'u etkinleştirebilir ve neyin tükendiğini görebilirsiniz.
anubhava

Bunu tam olarak nasıl yapabilirim? :-)

Lütfen buraya bakın: httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog Tek şey bu direktifin .htaccess içinde DEĞİL apache yapılandırmasına girmesidir.
anubhava

1
Aynı kuralı (yukarıdaki cevabım olarak) Apache kurulumuma kopyaladım ve sorunuzda bulunan aynı kıvrılma komutunu çalıştırdım ve Location: http://www.domain.com/başlıklarımın bir parçası olarak aldım , bu yüzden benim durumumda başlıklar ve html her ikisi de aynı etki alanını gösteriyor www.domain.com. Ayrıca yukarıdaki sorunuza ilgili access.log satırlarını da yapıştırabilir misiniz?
anubhava

0

[nc] yerine [NC] kullanmaya çalışabilir misiniz, bu kadar basit olabilir


Ve henüz değil :-) (zaten denendi, işe yaramadı)

0

Umarım sunucu erişiminiz vardır, belirtilen site belge klasörü izledikten sonra yönlendirme satırı eklendi

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

Sunucuya erişiminiz yoksa, bu satırı httaccess başlangıcına ekleyin / bölümü değiştirin.

Yeniden yönlendirmeden önce "RewriteEngine on" eklemeniz gerekebilir.


Dediğim RewriteEngine ongibi, bu başka bir sunucuda düzgün çalışıyor, sadece bu bir ekledim .

AllowOverride All, tüm bu satırları sunucu yapılandırma dosyanıza eklemenize izin verir

0

Deneyin:

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

0

Options +FollowSymLinksBir dizin bağlamında çalışıyorsanız emin olun .

Aksi takdirde, ad tabanlı sanal ana bilgisayarlar kullanıyorsanız şunları deneyin:

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

<VirtualHost *:80>
  ServerName www.domain.cz
  # whatever else
</VirtualHost>

Soruyu VirtualHost'un tanımı ile güncelledim.

Yukarıdaki çoklu VirtualHost çözümünü denediniz mi veya mod_rewrite kullanmaya hazır mısınız?
chris

İlk olarak, birden fazla VirtualHost kullanmak istemedim, ancak koşullar göz önüne alındığında yine de denedim ve yardımcı olmadı.

0

Tüm cevapları okuduktan sonra de / etc / hosts dosyasını kontrol edebilirsiniz ... belki tüm çekleriniz bilgisayarınızdan olabilir. Farklı bir konumdan erişmeye çalışın.


Hayır, ana bilgisayarlarda bu alanla ilgili hiçbir şey yok.

0

İkinci bir fikrim var. Gönderdiğiniz sunucu günlüğü, yerel ağdan bir adres olan "192.168.1.221" adresini gösterir. Tüm günlük girişleri aynı IP adresini gösteriyor mu? Bu durumda, sizinle sunucu arasında bir proxy vardır. Bu proxy muhtemelen üstbilgiyi değiştirmek için ProxyPassReverseveya kullanır .Header editLocation

Bu, arka uç sunucusu Locationharici proxy sunucusunun ana bilgisayar adı yerine başlığa kendi ana bilgisayar adını koyduğunda sorunu atlatmak için olağan bir kurulumdur .

Gerçekten bir proxy sunucusu varsa, proxy her zaman bilgilerin üzerine yazacağı için arka uç sunucusunun yapılandırması yerine proxy sunucusunun yapılandırmasını değiştirmeniz gerekecektir.

Bu, yanlış sunucuya her zaman baktığımız anlamına gelir: Sorun proxy sunucusuyla ilgili!


Yarın bu sunucuyu çalıştıran şirketin teknik desteğini arıyorum. Sanırım bu olmalı, sana bildireceğim.
cypher

0

.htaccessDosyada null gibi yazdırılamaz karakterler olabilir .

hexdump -C .htaccess

0

Yeniden yazma koşulunuzdan sonra bir $ işareti eksik olduğuna inanıyorum. Deneyin lütfen:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.cz$
RewriteRule ^(.*)$ http://www.domain.cz/$1 [R=301,L]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.