301 redirect till lowercase utan spelling mod?

Trädvy Permalänk
Medlem
Plats
Jönköping
Registrerad
Feb 2011

301 redirect till lowercase utan spelling mod?

Hej!

Har nyligen bytt från windowsserver till apache till min domän, och har slarvat med URL:er innan, vilket medfört att det är uppercase och lowercase i en röra, och nu när jag har bytt så blir det då en hel del "döda" länkar på grund av case mismatch.

Min host vill inte slå på spelling mod så det måste fixas på annat sätt.

Jag har hittar följande: http://www.askapache.com/htaccess/rewrite-uppercase-lowercase...

Men om jag förstår det rätt så gäller det alla filändelser. Det jag är ute efter är ett liknane script men som först kollar om filändelsen är .shtml, då det bara är denna filändelse jag vill peka om. Går det att lösa?

http://ozzed.net
Min egenkomponerade 8-bit musik. Gillar du musiken från gamla klassiska NES eller Gameboy och liknande är det värt ett besök :)
Jag finns också på Spotify, Jamendo,och du kan även följa mig på Twitter och Facebook.

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

Den där konfigurationen ser knäpp ut. Det kanske är bättre att använda en 404-handler som kollar ifall den efterfrågade resursen existerar i lowercase, och i sådana fall redirectar dit med 301. Inte så svårt att skriva.

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Jönköping
Registrerad
Feb 2011
Skrivet av Teknocide:

Den där konfigurationen ser knäpp ut. Det kanske är bättre att använda en 404-handler som kollar ifall den efterfrågade resursen existerar i lowercase, och i sådana fall redirectar dit med 301. Inte så svårt att skriva.

är det något man lägger in i .htaccess? Såg i kommentarerna nu att det ju inte verkar något vidare så det är nog bättre att titta på något annat som du säger.

http://ozzed.net
Min egenkomponerade 8-bit musik. Gillar du musiken från gamla klassiska NES eller Gameboy och liknande är det värt ett besök :)
Jag finns också på Spotify, Jamendo,och du kan även följa mig på Twitter och Facebook.

Trädvy Permalänk
Webbutvecklare
Moderator
Plats
::1
Registrerad
Dec 2002
Skrivet av Ozzed:

är det något man lägger in i .htaccess? Såg i kommentarerna nu att det ju inte verkar något vidare så det är nog bättre att titta på något annat som du säger.

Du kan dirigera om requests efter *.shtml där adressen innehåller stora bokstäver och det inte finns någon fil med det namnet till ett script som gör en extra kontroll och sedan antingen presenterar en 404 eller dirigerar vidare till rätt adress med en 301. I din htaccess skulle det se ut ungefär så här:

RewriteCond %{REQUEST_URI} \.shtml$ [NC] # Adressen måste sluta på .shtml RewriteCond %{REQUEST_URI} [A-Z] # ... och måste innehålla minst en stor bokstav RewriteCond %{REQUEST_FILENAME} !-f # ... och det får inte finnas en fil med namnet RewriteRule (.*) din404handler?uri=$1 [QSA,L]

Abstractions all the way down.

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Skrivet av Tunnelsork:

Du kan dirigera om requests efter *.shtml där adressen innehåller stora bokstäver och det inte finns någon fil med det namnet till ett script som gör en extra kontroll och sedan antingen presenterar en 404 eller dirigerar vidare till rätt adress med en 301. I din htaccess skulle det se ut ungefär så här:

RewriteCond %{REQUEST_URI} \.shtml$ [NC] # Adressen måste sluta på .shtml RewriteCond %{REQUEST_URI} [A-Z] # ... och måste innehålla minst en stor bokstav RewriteCond %{REQUEST_FILENAME} !-f # ... och det får inte finnas en fil med namnet RewriteRule (.*) din404handler?uri=$1 [QSA,L]

Det är en bra lösning.
En annan lösning är att vänta tills apache signalerar ett 404 — vilket det kommer göra om den inte hittar filen — och hantera uppslagningen med ett script.

ErrorDocument 404 /retry_lowercase.php

Fördelen är att servern inte behöver kolla en gång extra på disk för varje request, men det är nog ett väldigt litet problem. Nackdelar är att 404-handlern får ett större ansvarsområde än att bara serva en "hittades inte"-sida, samt att logiken för att sköta detta hamnar i en PHP-fil.

En annan fördel är att 404:orna successivt kommer bli ovanligare iom att man börjar returnera 301:or för resurser med blandade versaler och gemener, vilket i sin tur innebär att scriptet blir mer och mer irrelevant.

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Webbutvecklare
Moderator
Plats
::1
Registrerad
Dec 2002

@Ozzed: Hur gick det?

Abstractions all the way down.

Trädvy Permalänk
Medlem
Plats
Jönköping
Registrerad
Feb 2011
Skrivet av Tunnelsork:

@Ozzed: Hur gick det?

Jag har haft massa annat för mig men tänkte ta ett omtag med detta nu i veckan.

http://ozzed.net
Min egenkomponerade 8-bit musik. Gillar du musiken från gamla klassiska NES eller Gameboy och liknande är det värt ett besök :)
Jag finns också på Spotify, Jamendo,och du kan även följa mig på Twitter och Facebook.

Trädvy Permalänk
Medlem
Plats
Jönköping
Registrerad
Feb 2011

@Tunnelsork Alternativet med 404 som sista utväg är bättre tror jag, annars får jag ju massa 404 i loggarna även om adressen finns. Det jag är ute efter är ungefär såhär:

1: en adress som inte ger träff anges
2: någon slags mekanism kollar om adressen finns om man korrigerar stavningen
Antingen A, adressen hittas med korrigerad stavning och requesten skickas dit
Eller B, Adressen finns inte med någon stavning varpå användaren kommer till 404-sidan.

http://ozzed.net
Min egenkomponerade 8-bit musik. Gillar du musiken från gamla klassiska NES eller Gameboy och liknande är det värt ett besök :)
Jag finns också på Spotify, Jamendo,och du kan även följa mig på Twitter och Facebook.

Trädvy Permalänk
Webbutvecklare
Moderator
Plats
::1
Registrerad
Dec 2002

@Ozzed: Då bör du kunna använda exemplet ovan; ditt steg #1 är rewriten och steg #2 är ett script ("din404handler") som gör kontrollen och antingen svarar med en 301 och rätt adress, eller en 404. Har du t.ex. PHP tillgängligt?

Abstractions all the way down.

Trädvy Permalänk
Medlem
Plats
Jönköping
Registrerad
Feb 2011
Skrivet av Tunnelsork:

@Ozzed: Då bör du kunna använda exemplet ovan; ditt steg #1 är rewriten och steg #2 är ett script ("din404handler") som gör kontrollen och antingen svarar med en 301 och rätt adress, eller en 404. Har du t.ex. PHP tillgängligt?

Ja det är en apacheserver så PHP finns. Inte för att jag kan koda men det borde väl gå hitta snipplets eller vad det heter på nätet?

http://ozzed.net
Min egenkomponerade 8-bit musik. Gillar du musiken från gamla klassiska NES eller Gameboy och liknande är det värt ett besök :)
Jag finns också på Spotify, Jamendo,och du kan även följa mig på Twitter och Facebook.

Trädvy Permalänk
Webbutvecklare
Moderator
Plats
::1
Registrerad
Dec 2002

@Ozzed: Tveksamt om du hittar något helt färdigt när det är så specialiserat, och för att kunna ge en komplett lösning måste man veta mer om problemet (t.ex. om filerna är utspridda över flera mappar), men du kanske kan utgå från exemplet nedan och anpassa det till dina behov:

<?php // Det rätta filnamnet, om något kunde hittas. $filename = null; // Kontrollera att det finns ett värde för ?uri=something if(isset($_GET["uri"])) { // ... och att det är en sträng if(is_string($_GET["uri"])) { // ... och att det endast är ett enkelt filnamn if(preg_match("/^[a-z0-9_-]+\.shtml$/i", $_GET["uri"])) { // .. och att en fil med namnet som små bokstäver existerar i samma mapp som scriptet. if(is_file(sprintf("%s/%s", __DIR__, strtolower($_GET["uri"])))) { $filename = strtolower($_GET["uri"]); } } } } // Hittade vi ett nytt filnamn så redirectar vi till rätt adress if($filename !== null) { header("Location: http://www.example.com/path/till/filen/".$filename, true, 301); echo "Mitt fel."; } // annars svarar vi med en 404 else { header("Content-Type: text/plain", true, 404); echo "Ditt fel."; }

Dold text

Abstractions all the way down.

Trädvy Permalänk
Medlem
Plats
Jönköping
Registrerad
Feb 2011
Skrivet av Tunnelsork:

@Ozzed: Tveksamt om du hittar något helt färdigt när det är så specialiserat, och för att kunna ge en komplett lösning måste man veta mer om problemet (t.ex. om filerna är utspridda över flera mappar), men du kanske kan utgå från exemplet nedan och anpassa det till dina behov:

<?php // Det rätta filnamnet, om något kunde hittas. $filename = null; // Kontrollera att det finns ett värde för ?uri=something if(isset($_GET["uri"])) { // ... och att det är en sträng if(is_string($_GET["uri"])) { // ... och att det endast är ett enkelt filnamn if(preg_match("/^[a-z0-9_-]+\.shtml$/i", $_GET["uri"])) { // .. och att en fil med namnet som små bokstäver existerar i samma mapp som scriptet. if(is_file(sprintf("%s/%s", __DIR__, strtolower($_GET["uri"])))) { $filename = strtolower($_GET["uri"]); } } } } // Hittade vi ett nytt filnamn så redirectar vi till rätt adress if($filename !== null) { header("Location: http://www.example.com/path/till/filen/".$filename, true, 301); echo "Mitt fel."; } // annars svarar vi med en 404 else { header("Content-Type: text/plain", true, 404); echo "Ditt fel."; }

Dold text

Det gäller filer i olika mappar. Behöver man modda det något då? Sen undrar jag också om kodsnutten i slutet skickar besökaren till den 404-adress man normalt kommer till, eller om det är en sida där det står "Ditt fel", allstå ska jag i så fall byta ut "Ditt fel" mot koden som finns på min nuvarande hemmasnickrade 404-sida? Sorry om det är mycket frågor men jag är inte så hemma på kodning.

http://ozzed.net
Min egenkomponerade 8-bit musik. Gillar du musiken från gamla klassiska NES eller Gameboy och liknande är det värt ett besök :)
Jag finns också på Spotify, Jamendo,och du kan även följa mig på Twitter och Facebook.

Trädvy Permalänk
Webbutvecklare
Moderator
Plats
::1
Registrerad
Dec 2002
Skrivet av Ozzed:

Det gäller filer i olika mappar. Behöver man modda det något då?

Ja, men hur beror på hur strukturen ser ut.

Skrivet av Ozzed:

Sen undrar jag också om kodsnutten i slutet skickar besökaren till den 404-adress man normalt kommer till, eller om det är en sida där det står "Ditt fel", allstå ska jag i så fall byta ut "Ditt fel" mot koden som finns på min nuvarande hemmasnickrade 404-sida?

Det blir bara en sida där det står "Ditt fel", med en statuskod som låter klienten veta att resursen inte gick att hitta. Har du en annan 404-sida så kan du inkludera eller hänvisa till den.

Abstractions all the way down.

Trädvy Permalänk
Medlem
Plats
Jönköping
Registrerad
Feb 2011
Skrivet av Tunnelsork:

Ja, men hur beror på hur strukturen ser ut.

Kan vara t. ex ozzed.net/mapp/sida.shtml eller ozzed.net/mapp/mapp2/sida.shtml så det varierar.

Det blir bara en sida där det står "Ditt fel", med en statuskod som låter klienten veta att resursen inte gick att hitta. Har du en annan 404-sida så kan du inkludera eller hänvisa till den.
[/quote]

Enklast är nog att göra en hänvisning i så fall. Den heter bara 404.shtml och ligger i roten, så det är inga konstigheter egentligen.

http://ozzed.net
Min egenkomponerade 8-bit musik. Gillar du musiken från gamla klassiska NES eller Gameboy och liknande är det värt ett besök :)
Jag finns också på Spotify, Jamendo,och du kan även följa mig på Twitter och Facebook.