mboost-dp1

mod_rewrite i .htaccess


Gå til bund
Gravatar #1 - Jace
14. jun. 2010 16:06
Først min .htaccess-fil:

RewriteRule ([0-9]+)/$ post.php?id=$1


Hvis man kigger på nedenstående link så ses det at Google har indekseret det samme indhold på en masse forskellige URL's:
http://www.google.dk/search?q=allintitle:danske+sp...

Den originale:
http://www.jacobworsoe.dk/danske-split-test-cases-...

Kan også findes via denne:
http://www.jacobworsoe.dk/spor-soegemaskinernes-ro...

Hvilket skyldes den måde min .htacess er lavet på. Kan den laves så man kun kan finde den på den originale URL, men den anden enten giver en 404 eller kan 301-redirectes til den originale?

Problematikken er forresten beskrevet her: http://www.thomas-rosenstand.dk/duplicate-content
Gravatar #2 - Jace
14. jun. 2010 17:10
Jeg ved ikke om en mulig løsning kunne være noget med at tælle slashes?

F.eks. er der 4 slashes i den originale url, så man kunne lave noget med at alt over 4 slashes giver en 404? Men det virker også lidt som en klodset løsning :)
Gravatar #3 - Windcape
14. jun. 2010 21:26
#2

Du kunne jo bare output en 404 header hvis dit id parameter er invalid.

Dit problemet er jo vel at du faktisk matcher begge url's i din database (hvorfor har du flere url matches til samme artikel i første omgang?)
Gravatar #4 - Jace
14. jun. 2010 22:56
Det skyldes den måde det er lavet på.

Den kigger efter tallet lige før den sidste / så uanset hvad der står inden, så vil den altså kunne finde noget, hvis der bare står et tal lige før sidste /.

Det skal den bare ikke kunne.

F.eks. skal http://www.domain.dk/-19/-19/-20/-19/-20/ give en fejl 404, mens http://www.domain.dk/-20/ skal virke.

Så jeg ved ikke om man kan tælle de slashes og give en 404 hvis url'en indeholder mere end 4 slashes?
Gravatar #5 - Windcape
15. jun. 2010 01:01
#4

Hvorfor ikke lave det på en fornuftig måde, og lade dit software matche den givne "seo-friendly-url" som matcher et rowId i en tabel i din database.

Og så lade din software sende 301/404 som det nu passer sig.

Det andet virker fjollet... og slet ikke gennemtænkt.
Gravatar #6 - Jace
15. jun. 2010 10:09
Jeg skal gerne sige at jeg har lavet det på den måde, simpelthen fordi jeg ikke ved bedre...

Men din idé er at lave en kolonne i min tabel som f.eks. hedder "danske-split-test-cases-17" som jeg så går ind og matcher, istedet for bare at matche id'et, altså "17"?

Men det undgår vel ikke at der kan stå en masse foran det i url'en som det er tilfældet nu?
Gravatar #7 - Windcape
15. jun. 2010 10:40
Jace (6) skrev:
Men din idé er at lave en kolonne i min tabel som f.eks. hedder "danske-split-test-cases-17" som jeg så går ind og matcher, istedet for bare at matche id'et, altså "17"?
Jeps.

Jace (6) skrev:
Men det undgår vel ikke at der kan stå en masse foran det i url'en som det er tilfældet nu?
Jo, fordi hvis id'et ikke findes, så sender du et 404 header.

I php kan det gøres med

<?php header("HTTP/1.0 404 Not Found"); ?>
Gravatar #8 - Jace
15. jun. 2010 10:44
Okay, tak for hjælpen. Prøver lige at strikke det sammen :)
Gravatar #9 - Windcape
15. jun. 2010 10:54
#8

Konceptet er også navngivet som "slug" engang imellem.

En måde at lave et på er f.eks. sådan her


public static string GenerateSlug(string phrase)
{
string str = RemoveAccent(phrase).ToLower();

// invalid chars
str = Regex.Replace(str, @"[^a-z0-9\s-]", "");

// convert multiple spaces into one space
str = Regex.Replace(str, @"\s+", " ").Trim();

// cut and trim it
str = str.Substring(0, str.Length <= 45 ? str.Length : 45).Trim();

// hyphens
str = Regex.Replace(str, @"\s", "-");

return str;
}


Og så evt. append -<postid>, samt have kolonnen i din database som unique, så du er sikker på det er et unique slug.
Gravatar #10 - Frandsen
15. jun. 2010 16:11
Helt grundlæggende opstår fejlen fordi du ikke fortæller mod_rewrite hvor den skal starte og hvor den skal slutte med at finde din key.

Det er så også derfor du ser Googles crawler har indexeret praktisk talt samtlige kombinationer når man sætter dine links sammen - sådan arbejder den, og du "giver den lov"

Din rule kigger KUN på det allersidste der kommer FØR slash. Det der så kommer til sidst skal være ét til flere tal.

Når du nu er igang, og jeg kan næsten regne ud du gerne vil lave det newz har, i hvert fald på nyheder, hvor URLen er ID du mapper til din database. Jeg synes selv det er den fede, og rigtige, måde, det eneste det kræver er at dit script når du opretter en ny nyhed lige checker den valgte titel, der efterfølgende konverteres til URL ikke allerede er brugt.

På newz kan du se man har været nødsaget til at inkludere ID'et i forumdelen fordi man ikke kan være sikker på at vi, brugerne, altid laver unikke titler. ID'et ses til sidst i url i f.eks. denne tråd.

Mulig løsning:

RewriteEngine on
RewriteRule ^([a-z0-9-]+)/$ post.php?id=$1 [L]

ErrorDocument 404 /error404.php


^ = Fortæller at herfra skal mod_rewrite starte med at finde key(s)
$ = Indikere slut for identificering af keys

Ovenfor ville en gyldig URL (bogstaver fra a-z, tal fra 0-9 samt "-") derfor være:

http://www.jacobworsoe.dk/danske-split-test-cases-17/


Mens:

http://www.jacobworsoe.dk/noget/nogetandet/


ikke ville pga. "slash" i key ikke er gyldigt.
Gravatar #11 - Jace
15. jun. 2010 16:30
Frandsen: Tak for din hjælp, nu giver det lidt mere mening.

Sikrer din løsning også at:
http://www.jacobworsoe.dk/spor-soegemaskinernes-robotter-i-google-analytics-16/danske-split-test-cases-17/

vil resultere i en 404?
Gravatar #12 - Frandsen
15. jun. 2010 18:28
Ja,
http://www.jacobworsoe.dk/kun-bogstaver-tal-123-samt-bindestreg-er-gyldige-efterfuldt-af-slash/


Hverken
http://www.jacobworsoe.dk/url-uden-slash
http://www.jacobworsoe.dk/url med mellemrum
http://www.jacobworsoe.dk/url-med/flere-slashes/[/code]
er gyldige, og fordi de ikke kan matche Rule, kastes din custom Fejl 404 på error404.php.

Fjernes sidste linie, ser brugeren browserens indbyggede Fejl 404 side.

Måske er den for stram nu, det kommer an på din struktur.
Gravatar #13 - Jace
19. jun. 2010 19:55
Frandsen: Jeg har fundet en artikel, som har en endnu mere elegant løsning med 301-redirect istedet for bare en 404. Den har jeg prøvet at implementere, og det virker rigtig godt:
http://blog.loevgaard.dk/undga-duplicate-content-p...

Gravatar #14 - Frandsen
20. jun. 2010 09:24
Jeg kan ikke umiddelbart helt se hvor det elegante i den løsning ligger.
Hans argument med at "en ond konkurrent" jo kunne oprette falske links hvor artikel-navnet er ændret holder jo ikke en meter.
Hvad så hvis jeg i stedet ændre ID'en, så løser hans hjælpe-script jo intet?
Sådan vil det altid være når man opdeler key'en i brudstykker.
Det var jo også derfor jeg foreslog at hele key'en skal være ID. Den løsning kræver ingen hjælpe-scripts, og man skal da være mere end uopfindsom hvis man ikke kan komme på en unik titel hver gang?
Gravatar #15 - Frandsen
20. jun. 2010 09:56
Sat på spidsen kan man sige hans "løsning" kun afhjælper et problem han selv har skabt.

Fordi
RewriteRule ^([a-zA-Z0-9\-]+)\-([0-9]+)/$

måske nok var tiltænkt
site.com/artikel-navn-144/

virker
site.com/noget-andet-144/
site.com/noget-helt-andet-144/

også, fordi han kun kigger på sidste key, ID'en.
Så prøver han så at løse sit selvskabte duplicate content problem med et hjælpe-script.
Hvorfor ikke bare helt undgå flere muligheder, og lade hele URI'en være din ID?
Gravatar #16 - kasperd
20. jun. 2010 13:03
Hvis du tilføjer et R flag til din regel vil der redirectes:

RewriteRule ([0-9]+)/$ post.php?id=$1 [R]

Men det er muligvis ikke helt hvad du havde i tankerne.

Muligvis ønsker du noget i retning af:

RewriteRule ../([^/]+)/$ /$1/ [R]
RewriteRule ([0-9]+)/$ post.php?id=$1

Du er nødt til at holde øje med at reglerne ikke resulter i cykliske redirects. For at undersøge den slags er det bedre at bruge et kommandolinieværktøj som f.eks. wget i stedet for en browser, som kun viser hver enkelt URL en brøkdel af et sekund.
Gravatar #17 - Jace
20. jun. 2010 22:41
Frandsen: Jeg kan godt se din pointe, men lige præcis i mit tilfælde, så virker løsningen jo perfekt. Da mit duplicate content problem lige præcis passer med det problem han har "konstrueret".

Og uden at brække key'en op har man jo ikke mulighed for at redirecte til den rigtige, men kun give en 404 hvis key'en ikke matcher noget i databasen.

Når Google har registreret min ændring og fjernet alle de forkerte url's fra deres indeks vil jeg dog ændre min struktur til en løsning med en samlet key.
Gravatar #18 - Jace
20. jun. 2010 22:46
kasperd: Selve redirected bliver lavet i php filen, da jeg først checker om URL'en er rigtig og kun redirecter hvis den er forkert i forhold til det ID der er sendt med i URL'en.

Jeg har tjekket mit redirect med denne service:
http://www.seoconsultants.com/tools/headers

Det virker perfekt hvis man f.eks. smider denne ind:
http://www.jacobworsoe.dk/spor-soegemaskinernes-robotter-i-google-analytics-16/danske-split-test-cases-17/


Jeg har prøvet med curl som er indbygget på min Mac, men den skriver ikke noget hvis man giver den det ovenstående link. Så jeg må prøve at få smidt wget på maskinen istedet :)

Gravatar #19 - kasperd
21. jun. 2010 06:52
Hvis du bruger curl hjælper det muligvis at angive -Lv
Gravatar #20 - Jace
21. jun. 2010 07:14
kasperd (19) skrev:
Hvis du bruger curl hjælper det muligvis at angive -Lv

Jeps, det virkede. Tak for det :)
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login