Flere domæner og 301 viderestillinger

Her postes alt, som ikke direkte har noget med Ubuntu at gøre.
Brugeravatar
NickyThomassen
Admin
Indlæg: 3652
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Flere domæner og 301 viderestillinger

Indlæg af NickyThomassen »

Så vidt jeg kan læse mig frem til, så bruger man "301 - Moved Permanently" hvis man har flere domæner, som viser det samme indhold fra den samme server.

Jeg kan sagtens få det til at virke, både med HTML (som vist ikke skulle være så god), med PHP og med Apaches konfiguration i sig selv:

Kode: Vælg alt

HTML:
<!DOCTYPE html>
<html lang="da-dk"><head>
<meta ... />
<meta http-equiv="Refresh" content="0; url=http://domæne.tld/" />
</head><body>
</body></html>

PHP:
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://domæne.tld");
exit();
?>

Apaches serverkonfig:
<VirtualHost *:80>
   ...
   Redirect permanent / http://domæne.tld
</VirtualHost>


Problemet kommer når jeg analyserer den fremsendte HTTP-header med Wireshark, for den siger "HTTP/1.1 200 OK" i stedet for noget med "301 - Moved Permanently". Spørgsmålet er så, om det virker som det skal?

Målet er især at søgemaskiner gerne skulle være klar over, at domænerne repræsenterer én side kun. Grunden til at jeg har flere domæner, er både historisk, men også for at dække de almindelige stavemåder og "forkorte" domænenavnet.
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: Flere domæner og 301 viderestillinger

Indlæg af lath »

TitanusEramius skrev:Så vidt jeg kan læse mig frem til, så bruger man "301 - Moved Permanently" hvis man har flere domæner, som viser det samme indhold fra den samme server.

Du kan godt sende en 301, men eftersom HTTP 1.1 understøtter flere website på den samme IP adresse kan du konfigurere først DNS til at pege på webserveren, og dernæst konfigurere webserveren, f.eks.

http://www.example.com -> IP 1.2.3.4 og
http://www.eksempel.dk -> IP 1.2.3.4

Så skal webserveren, der i dette eksempel sidder på IP adressen 1.2.3.4 port 80 vise de samme ting uanset om det kommer en GET på http://www.example.com eller http://www.eksempel.dk hvis serveren modtager samme sti i GET'en f.eks /index.php.

TitanusEramius skrev:Jeg kan sagtens få det til at virke, både med HTML (som vist ikke skulle være så god), med PHP og med Apaches konfiguration i sig selv:

Kode: Vælg alt

HTML:
<!DOCTYPE html>
<html lang="da-dk"><head>
<meta ... />
<meta http-equiv="Refresh" content="0; url=http://domæne.tld/" />
</head><body>
</body></html>

PHP:
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://domæne.tld");
exit();
?>

Apaches serverkonfig:
<VirtualHost *:80>
   ...
   Redirect permanent / http://domæne.tld
</VirtualHost>


Problemet kommer når jeg analyserer den fremsendte HTTP-header med Wireshark, for den siger "HTTP/1.1 200 OK" i stedet for noget med "301 - Moved Permanently". Spørgsmålet er så, om det virker som det skal?

Målet er især at søgemaskiner gerne skulle være klar over, at domænerne repræsenterer én side kun. Grunden til at jeg har flere domæner, er både historisk, men også for at dække de almindelige stavemåder og "forkorte" domænenavnet.


Du skal sende HTTP headers ud før du sender HTML'en, ellers sender den en 200 kode og det er ikke det rigtige, når du vil sende en 301.

På mit website har jeg en index.php fil med følgende indhold:

Kode: Vælg alt

<?
header( "HTTP/1.1 301 Moved Permanently" );
header( "Location: http://wp.larsth.dk" );
?>

... og det virker.
Du kan sikkert godt tilføje noget HTMl til ære for old-gamle browsere der ikke forstår beskeden, men det burde ikke være tilfældet idag.
Mange værktøjer, bortset fra de mest simple, forstår fint HTTP headers.

/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
Brugeravatar
NickyThomassen
Admin
Indlæg: 3652
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Re: Flere domæner og 301 viderestillinger

Indlæg af NickyThomassen »

De 3 kodeeksempler har jeg prøvet hver for sig, og så analyseret deres resultater. De giver alle 3 "200 - OK".

Det ene sted jeg gerne vil bruge en 301 er med firmaserverene, hvor jeg har domænerne nt-data.dk og ntdata.dk. Da firmaet hedder nt-data, så er ntdata.dk i princippet en service, og alt som domænet skal bruges til, er at dirigere til nt-data.dk.

Hvis jeg prøver med

Kode: Vælg alt

<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://nt-data.dk");
?>
i vhost'en, nulstiller cachen i browseren og genstarter apache2 / varnish, så registrerer Wireshark stadig en " 200 - OK":

Kode: Vælg alt

GET / HTTP/1.1
Host: ntdata.dk
User-Agent: Mozilla/5.0 (X11; U; Linux i686; da-dk) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+ Debian/squeeze (2.30.6-1) Epiphany/2.30.6
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Encoding: gzip
Accept-Language: da-dk, da;q=0.90

HTTP/1.1 200 OK
X-Powered-By: PHP/5.3.3-7+squeeze14
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Type: text/html
Server: Skynet
Content-Length: 339
Date: Sat, 27 Oct 2012 10:58:12 GMT
Age: 0
Connection: keep-alive
Puljen: MISS


Resultatet er det samme med HTTP- og Apache-viderestillingerne. nt-data.dk og ntdata.dk er på samme server, så i DNS har de samme IP-adresse, og jeg har dobbelttjekket DocumentRoot for at sikre at det er den rigtige index.php der bliver læst.

Jeg har også lige prøvet med

Kode: Vælg alt

RewriteEngine on
RewriteRule ^(.*)$ http://nt-data/ [L,R=301]
men med samme resultat.
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: Flere domæner og 301 viderestillinger

Indlæg af lath »

TitanusEramius skrev:De 3 kodeeksempler har jeg prøvet hver for sig, og så analyseret deres resultater. De giver alle 3 "200 - OK".

Det ene sted jeg gerne vil bruge en 301 er med firmaserverene, hvor jeg har domænerne nt-data.dk og ntdata.dk. Da firmaet hedder nt-data, så er ntdata.dk i princippet en service, og alt som domænet skal bruges til, er at dirigere til nt-data.dk.

...

Resultatet er det samme med HTTP- og Apache-viderestillingerne. nt-data.dk og ntdata.dk er på samme server, så i DNS har de samme IP-adresse, og jeg har dobbelttjekket DocumentRoot for at sikre at det er den rigtige index.php der bliver læst.

Jeg har også lige prøvet med

Kode: Vælg alt

RewriteEngine on
RewriteRule ^(.*)$ http://nt-data/ [L,R=301]
men med samme resultat.


Normalt tester man først at det virker lokalt - indefra og udad.
Med indefra og ud mener jeg først inderste komponent og det er her Apache. Derefter er det Varnish da den spørger Apache webserveren.

Først når det virker lokalt tester man så udefra.

Årsagen til at man tester på den måde er at det gør det nemmere at lokalisere en fejl.
F.eks. hvis det virker lokalt for både Apache og Varnish, men der kommer fejl udefra er problemet at finde imellem dig (eller rettere: din computer) og så Varnish på din server.
Derimod, hvis apache returnerer det rigtige, men Varnish ikke gør, så er det en Varnish konfigureringsfejl.

/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
AJenbo
Admin
Indlæg: 20878
Tilmeldt: 15. nov 2009, 15:04
IRC nickname: AJenbo
Geografisk sted: Vanløse, København

Re: Flere domæner og 301 viderestillinger

Indlæg af AJenbo »

Nogle konfigurationer fungere ikke med at skrive status direkte, prøv denne i stedet:

Kode: Vælg alt

<?php
header("Location: http://nt-data.dk", true, 301);

Gzip bør også være deaktivert når der ikke er en body

Virker det ikke så giv lige den her et forsøg (til farst CGI server);

Kode: Vælg alt

<?php
header("Status: 301 Moved Permanently");
header("Location: http://nt-data.dk", true, 301);
Brugeravatar
NickyThomassen
Admin
Indlæg: 3652
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Re: Flere domæner og 301 viderestillinger

Indlæg af NickyThomassen »

Mange tak for den kombineret hjælp, jeg fik det til sidst til at virke med den :)

Den overordnede fejl var, at jeg havde skrevet ntdata.dk ind som alias i nt-data.dk's vhost, så ntdata.dk's vhost blev i første omgang slet ikke matchet. Det hjalp en del at fejlsøge direkte på Apache i stedet for at gå igennem Varnish.

Jeg bruger så denne her kode i index.php nu:

Kode: Vælg alt

<?php
header("Location: http://nt-data.dk", true, 301);
header("Connection: close");
exit();
?>

Er det fornuftigt, eller kan linierne med close og exit undværes?
AJenbo
Admin
Indlæg: 20878
Tilmeldt: 15. nov 2009, 15:04
IRC nickname: AJenbo
Geografisk sted: Vanløse, København

Re: Flere domæner og 301 viderestillinger

Indlæg af AJenbo »

Jeg ville undlade afslutningen af php så du ikke risikere at fylde indholde med, så er der heller ikke grund til exit. Close er måske en god ide, i værste tilfælde lige gyldig. Husk / for enden af domænet så den ikke laver et ekstra redirect når brugeren når frem. Faktisk ville jeg bruge request_uri så deep link bliver taget med:

Kode: Vælg alt

<?php
header("Location: http://nt-data.dk" . $_SERVER['REQUEST_URI'], true, 301);
header("Connection: close");
Brugeravatar
NickyThomassen
Admin
Indlæg: 3652
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Re: Flere domæner og 301 viderestillinger

Indlæg af NickyThomassen »

Ok, jeg takker. Alt ser ud til at virke perfekt, så det her må være løsningen.
Jeg har så tilføjet en expire på + 1 måned, så Varnish kan servere index.php, og det virker vist også fint.