Kom ihåg mig?
Home Menu

Menu


vidarebefoda gamla sidor till nya

Ämnesverktyg Visningsalternativ
Oläst 2008-04-02, 08:35 #1
objx objx är inte uppkopplad
Medlem
 
Reg.datum: Mar 2008
Inlägg: 154
objx objx är inte uppkopplad
Medlem
 
Reg.datum: Mar 2008
Inlägg: 154
Jag har utvecklat ett eget publiceringsverktyg som jag använder både till egna projekt, men även till mina kunder.

Mitt publiceringsverktyg skapar automatiskt en fysisk katalogstruktur med index-filer för varje undersida.

Ex.
/ -> Start
/om-foeretaget/ -> Om företaget
/om-foeretaget/vaara-tjaenster/ -> Om företaget -> Våra tjänster.

Tidigare gjorde jag som de flesta andra system: dumpade alla sidor till en index.php på roten av webbhotellet, och använde PHP för att läsa av och bestämma vilken sida som skall visas utifrån hur URL'n ser ut.

Jag har valt att skapa fysiska mappar för att slippa köra onödigt många databasförfrågningar och snabba upp sidvisningarna i största allmänhet.

När jag tar bort en sida ur systemet så tar mitt system även bort mappen på servern.
Men säg nu att jag skulle vilja hänvisa besökare som försöker nå den gamla adressen till en ny sida, utan att servern kastar fram ett 404-meddelande. Hur gör jag det enklast?

Min idé var att jag skulle lagra alla borttagna sidor i en MySQL-tabell. Om en sida skall hänvisas till en ny sida så sparas även den adressen i den här tabellen.

När en besökare försöker nå en sida som inte längre finns (t.ex på i sökresultatet på google) så skulle jag vilja kunna läsa av MySQL-tabellen innan servern visar 404-felmeddelandet. OM sidan skall hänvisas vidare så skickas man till den sidan istället för att hamna på felsidan.

Det är viktigt att en sida som har tagits bort permanent verkligen tolkas som en 404 av sökmotorerna.

Om en sida inte existerar fysiskt på servern, kan jag då använda htaccess för att hänvisa till en PHP-fil, som i sin tur läser av MySQL-tabellen och returnerar korrekt header beroende på om sidan tagits bort eller skall hänvisas vidare?

Vad krångligt det lät när jag läste igenom det.. Nåja, ni förstår kanske ändå.
objx är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-02, 09:50 #2
MMCs avatar
MMC MMC är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2008
Inlägg: 560
MMC MMC är inte uppkopplad
Mycket flitig postare
MMCs avatar
 
Reg.datum: Jan 2008
Inlägg: 560
Om du nu skapar en katalogstruktur med indexfiler för varje adress, varför inte bara behålla adressen som ska vidarebefordra och låta index-filen skicka en 301 till den nya adressen? Missförstår jag vad du vill åstadkomma nu?
MMC är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-02, 10:04 #3
jonny jonny är inte uppkopplad
Supermoderator
 
Reg.datum: Sep 2003
Inlägg: 6 941
jonny jonny är inte uppkopplad
Supermoderator
 
Reg.datum: Sep 2003
Inlägg: 6 941
Du kan ställa in htaccess att skicka alla förfrågningar där filen eller katalogen inte finns till exempelvis errorhandler.php som bör generera en 404 om sidan verkligen inte finns och inte ska göra något annat.
jonny är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-02, 10:15 #4
objx objx är inte uppkopplad
Medlem
 
Reg.datum: Mar 2008
Inlägg: 154
objx objx är inte uppkopplad
Medlem
 
Reg.datum: Mar 2008
Inlägg: 154
MMC:
Ja, det skulle ju faktiskt vara en lösning. Det enda problemet som jag kan komma på med den lösningen är att det kan bli en rätt rörig katalogstruktur på webbservern. Efter ett år lär man ju ha ett par hundra mappar som inte gör något annat än att vidarebefodra besökare till en annan katalog.

jonny:
Det är precis det jag ville åstadkomma.
Räcker det med att skicka en "header("HTTP/1.0 404 Not Found");" via PHP för att sökmotorspindlar och besökare skall få ett korrekt 404-meddelande?
objx är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-02, 10:41 #5
jonny jonny är inte uppkopplad
Supermoderator
 
Reg.datum: Sep 2003
Inlägg: 6 941
jonny jonny är inte uppkopplad
Supermoderator
 
Reg.datum: Sep 2003
Inlägg: 6 941
Det borde räcka.
jonny är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-02, 10:51 #6
objx objx är inte uppkopplad
Medlem
 
Reg.datum: Mar 2008
Inlägg: 154
objx objx är inte uppkopplad
Medlem
 
Reg.datum: Mar 2008
Inlägg: 154
Ibland behöver man en liten hjälp på traven för att lyckas.
Nu är det löst.

För er som dyker på samma problem kommer här min lösning på det hela.

Jag skapade en MySQL-tabell som hade följande struktur:
-------------------------------------------------
CREATE TABLE `redirections` (
`id` mediumint(9) NOT NULL auto_increment,
`host` text,
`path` text,
`query` text,
`redirection` text,
`statuscode` varchar(20) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-------------------------------------------------

I rooten av webbservern lade jag sedan in följande regel i min .htaccess:
-------------------------------------------------
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.+) - [PT,L]

RewriteRule .*(\?.*) /path-to-error-messages/404.php$1
RewriteRule .* /path-to-error-messages/404.php
-------------------------------------------------

Detta skickar all trafik som inte är en fysisk fil till "/path-to-error-messages/404.php".

Därefter kör jag följande PHP-kod:
-------------------------------------------------

$url = $_SERVER['REQUEST_URI'];
if(isset($_SERVER['SCRIPT_URI'])){
$url = $_SERVER['SCRIPT_URI'];
}elseif(isset($_SERVER['HTTP_HOST']) && isset($_SERVER['REQUEST_URI'])){
$httphost = preg_match("/^http\:\/\/.+/", $_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : "http://".$_SERVER['HTTP_HOST'];
$url = $httphost.$_SERVER['REQUEST_URI'];
}else{
$url = "";
}
$querystring = $_SERVER['QUERY_STRING'];
if(strlen($querystring) > 0){ $url .= "?".$querystring;}
$host = parse_url($url, PHP_URL_HOST);
$path = parse_url($url, PHP_URL_PATH);
$query = parse_url($url, PHP_URL_QUERY);

$redirectioncheck = mysql_query("SELECT * FROM redirections WHERE host='$host' && path='$path' && query='$query'");

if($redirectioncheck && mysql_num_rows($redirectioncheck) > 0){
$redirection = mysql_fetch_object($redirectioncheck);
header("HTTP/1.0 301 Moved Permanently");
header("Location: ".$redirection->redirection);
}else{
header("HTTP/1.0 404 Not Found");
}
-------------------------------------------------

Tack för hjälpen!
objx är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-02, 12:20 #7
objx objx är inte uppkopplad
Medlem
 
Reg.datum: Mar 2008
Inlägg: 154
objx objx är inte uppkopplad
Medlem
 
Reg.datum: Mar 2008
Inlägg: 154
Hittade ett fel i htaccess-reglerna och fick dåligt samvete om någon i framtiden tänker använda detta:

Så här skall htaccess-reglerna se ut:
---------------------------------------------
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteRule .* - [L]
RewriteRule .* /path-to-error-messages/404.php$1
objx är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 21:50.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017