Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  11 3509
La oss si at jeg har en internettside, fiktivside.com, hvor man kan gjøre oppslag etter bestemte ting basert på for eksempel fylke. Man søker på "Hedmark", og får opp en liste med ting av en bestemt art (murermestere, for eksempel) som er knyttet til Hedmark fylke.

En rimelig tradisjonell måte å løse dette på, er å ha en index.php som viser søkeskjemaet, og la det poste med GET (for mulig direktelinking) til en annen side, for eksempel results.php. I results.php plukker man ut GET-parameteret, søker i databasen og dersom fylket finnes skriver man ut resultatene for det fylket; mens om fylket ikke finnes, skriver man nettopp det og ber brukeren gå tilbake og prøve på nytt.

En litt slickere måte å gjøre dette på, er med routing. Så i stedet for at man ved søk på "Hedmark" kommer til URLen "fiktivside.com/results.php?fylke=Hedmark", så kommer man til "fiktivside.com/Hedmark".

Mitt inntrykk er da at det er best at alle requests går til index.php. Å splitte ut routingen og bruke det som parameter er ikke særlig vanskelig. Men hvordan er det her best å gjøre omdirigeringen?

Dersom man søker på noe som finnes, som "Hedmark", så ønsker man en omdirigering til "fiktivside.com/Hedmark". Men hvilken HTTP status code er best egnet til denne omdirigeringen? PHPs 'header("Location: ...")' bruker 302, men dette er ut fra hva jeg leser ikke helt riktig. 301 er opplagt galt. 303 virker riktigst ut fra den korte beskrivelsen på Wikipedia, men på den mer utfyllende artikkelen virker det ikke riktig likevel. Kanskje dette er bare pirk og uvesentlig, og normal praksis er å bruke 302?

En annen ting er, hvordan bør man gjøre routingen til et feilet søk? Dersom noen manuelt skriver inn "fiktivside.com/Baretullfinnesikke", så bør den omdirigere til en 404. Men om noen søker på fylke i skjemaet med strengen "Baretullfinnesikke", så virker det veldig galt å omdirigere til 404. Om man i stedet router feilede søk til f.eks. "fiktivside.com/Feiletsøk" med søketermen som POST-argument for å gi en fornuftig feilmelding, hva bør skje om man går direkte til "fiktivside.com/Feiletsøk" uten noe POST-argument? Eller om man (søkt, jeg vet) sender en POST-request med et eksisterende fylke til samme side, er det da akseptabelt at den bråkjekt påstår at fylket "Hedmark" ikke eksisterer? Det siste vil jo være et resultat av tukling utenfra, og kan kanskje aksepteres, men det virker ikke super-clean.

Finnes det noe akseptert best practice for tilfeller som dette? Er det eventuelt noen som har noen gode ideer på hvordan dette best løses?
Sist endret av Provo; 19. april 2018 kl. 15:14.
Beklager hvis jeg bommer veldig på temaet, men dersom det faktisk er snakk om fylker, hvorfor ikke bruke en dropdown-meny i stedet for et tekstfelt? Eller sågar bare en enkelt liste med lenker til respektive fylkessider. Det ville jo gjort hele oppsettet veldig mye enklere.

Jeg er klar over at du egentlig spør om noe annet, sannsynligvis fordi det er en del av et større og mer komplisert system(?), men til problemet du faktisk skisserer her så skulle det jeg nevner over være veldig tilstrekkelig.
Takk for tips, men fylke var bare et eksempel. La oss anta at det er for mange av dem til at en nedtrekksmeny er brukbart.
Limited edition
Moff's Avatar
Sitat av Provo Vis innlegg
Men om noen søker på fylke i skjemaet med strengen "Baretullfinnesikke", så virker det veldig galt å omdirigere til 404.
Vis hele sitatet...
Hvorfor virker dette veldig galt? 404 er korrekt å bruke om man ber om noe som ikke eksisterer. Personlig ville jeg nok også gått for en dropdown-meny for fylker, men om du vil ha et søk, så hadde jeg løst det ved å alltid rute søket til den samme URL-en. Om du søker på "hedmark", så blir dette sendt til dinside.no/hedmark. Om du søker på "fisk", så blir dette også sendt til dinside.no/fisk. Måten jeg hadde løst 404 på er rett og slett ved å laste opp en egendefinert 404-side som ser likedan ut som den normale siden, men har en beskjed om at det du søker etter ikke finnes. Hensikten med å sende 404 er at nettleseren forstår at dette er en ugyldig URL som ikke skal lagres (i adressefeltets autocomplete, for eksempel), så det blir derfor veldig feil å svare noe annet enn 404.
Trigonoceps occipita
vidarlo's Avatar
Donor
Sitat av Provo Vis innlegg
En litt slickere måte å gjøre dette på, er med routing. Så i stedet for at man ved søk på "Hedmark" kommer til URLen "fiktivside.com/results.php?fylke=Hedmark", så kommer man til "fiktivside.com/Hedmark".
Vis hele sitatet...
Kvifor redirecte? Rewrite serverside, slik at example.com vert skreve om til example.com/index.php?foo=Hedemark.

Det gir reinare URLer, fullstendig frikopla frå logikken bak sida, noko som gjer at bokmerker vil fortsette å fungere etter at du har bytta ut php med aspx i 2029.

Redirect vil og føre til to RTT mellom nettleser og nettside, altså lenger tid. Rett nok ikkje meir enn 40-50ms om du har fornuftig hosting, men det er jo tid det og.
nso
popålol
nso's Avatar
Administrator
Som vidarlo sier. Redirect != rewrite.

Redirect vil gjøre at klienten går til url a, får beskjed om å istedet gå til url b, så gå til url b (og bytte den om i adressebaren) og få servert innholdet.
Rewrite gjør at klienten går til url a, serveren vet at a er alias for b og serverer innholdet til b.

Med rewrite trenger du ikke forholde deg til statuskoder.
Sist endret av nso; 19. april 2018 kl. 21:51.
Routingen var tenkt gjort med rewrite, ja. Med redirect tenkte jeg på at dersom man submitter formet på vanlig måte, så vil det bli en GET request til example.com?foo=Hedmark, som man ønsker å egentlig være en GET request til example.com/Hedmark. Klart, man kan jo ha en onsubmit på formet som stopper vanlig submit og heller gjør noe slik som "window.location.href='example.com/ '+search.value;", men man vil vel gjerne ha redirect dersom brukeren har javascript deaktivert og skjemaet postes på vanlig vis. Og da er statuskode relevant. Eller finnes det en bedre måte å gjøre det samme på?

Jeg vurderte også redirect til 404, men det er jo ved nærmere ettertanke liten vits. URL beholdes, også serveres en 404-side. Jeg er fortsatt ikke helt overbevist om at 404 er en fornuftig respons på en søketerm som ikke treffer. Jeg har aldri vært borti en side som gir 404 dersom en søketerm bommer, men på en annen side er dette egentlig mer et oppslag enn et vanlig søk, så kanskje det er greit likevel. Men mulig det mest fornuftige er å behandle alt etter example.com/ som en søkestreng, uavhengig av om det kommer fra søkeskjema eller ikke, og aldri gi noen 404. Litt vanskelig å bli enig med seg selv her.
404 gir mening om man forsøker å taste inn en URL selv, og kommer til noe som ikke finnes. Etter min mening, burde en bruker *aldri* få 404 bare ved å trykke rundt på en nettside. Den statusen er forbeholdt døde lenker, spør du meg.

Løsningen mange benytter er, som nevnt over, å rewrite example.com/foo til example.com/index.php?bar=foo internt. Index.php sjekker derfra om parameterne finnes, og serverer innholdet som passer. Hvis det ikke er noe innhold, så kan du servere en feilmeldings-mal, med tekst basert på hva slags funksjon som trigget den. Typisk sjekke if isset($bar) && count_rows(db_lookup($_GET['bar'])) == 0 og så spytte ut en melding om at "Funksjonen bar fant 0 treff, <søkefelt her for å prøve igjen>".

De fleste undersidene på nettsiden følger vanligvis en eller annen mal, så det er snakk om å fylle inn den dynamiske content-biten med noe forklarende tekst. Hvis nettstedet ditt har vidt forskjellige undersider, med varierende design og eksternt innhold, så blir dette derimot litt vanskeligere å få fint.

Edit: Angående biten for å gjøre om GETen så det ikke "synes" i adressefeltet, så fikser mod_rewrite dette også. Vanligvis med en 301 internt. For eksempelet over så er det noe sånn som det her (bare fra hukommelsen, ikke testet)

Kode

Options +FollowSymLinks -MultiViews    
RewriteEngine on

RewriteCond %{THE_REQUEST} /index\.php\?s=([^&\s]+)\s [NC]
RewriteRule ^ /%1? [R=301,L,NE]

RewriteRule ^/([^/]+)/?$ index.php?s=$1 [QSA,L,NC]
Sist endret av Dyret; 20. april 2018 kl. 15:44.
Sitat av Dyret Vis innlegg
404 gir mening om man forsøker å taste inn en URL selv, og kommer til noe som ikke finnes. Etter min mening, burde en bruker *aldri* få 404 bare ved å trykke rundt på en nettside. Den statusen er forbeholdt døde lenker, spør du meg.

Løsningen mange benytter er, som nevnt over, å rewrite example.com/foo til example.com/index.php?bar=foo internt. Index.php sjekker derfra om parameterne finnes, og serverer innholdet som passer. Hvis det ikke er noe innhold, så kan du servere en feilmeldings-mal, med tekst basert på hva slags funksjon som trigget den. Typisk sjekke if isset($bar) && count_rows(db_lookup($_GET['bar'])) == 0 og så spytte ut en melding om at "Funksjonen bar fant 0 treff, <søkefelt her for å prøve igjen>".

De fleste undersidene på nettsiden følger vanligvis en eller annen mal, så det er snakk om å fylle inn den dynamiske content-biten med noe forklarende tekst. Hvis nettstedet ditt har vidt forskjellige undersider, med varierende design og eksternt innhold, så blir dette derimot litt vanskeligere å få fint.

Edit: Angående biten for å gjøre om GETen så det ikke "synes" i adressefeltet, så fikser mod_rewrite dette også. Vanligvis med en 301 internt. For eksempelet over så er det noe sånn som det her (bare fra hukommelsen, ikke testet)

Kode

Options +FollowSymLinks -MultiViews    
RewriteEngine on

RewriteCond %{THE_REQUEST} /index\.php\?s=([^&\s]+)\s [NC]
RewriteRule ^ /%1? [R=301,L,NE]

RewriteRule ^/([^/]+)/?$ index.php?s=$1 [QSA,L,NC]
Vis hele sitatet...
Hvis forskjellige søkeord tar en videre til helt forskjellige sider med vidt forskjellige layouts, bør man virkelig revurdere hele designet. Dette er drap av UX til de grader, og skaper kun forvirrelse blant brukerene.

Skjønner at det er off-topic her siden vi er ute etter konseptet rundt statuskoder, men føler det er verdt å nevne.
Sitat av Dyret Vis innlegg
404 gir mening om man forsøker å taste inn en URL selv, og kommer til noe som ikke finnes. Etter min mening, burde en bruker *aldri* få 404 bare ved å trykke rundt på en nettside. Den statusen er forbeholdt døde lenker, spør du meg.
Vis hele sitatet...
Det er egentlig det jeg tenker også. Derfor kunne det kanskje vært ønskelig å skille mellom om noen har skrevet "Fjas" i søkefeltet, og derfor blitt sendt til example.com/Fjas, som ikke gir treff, eller om de har tastet inn URLen example.com/Fjas. Det første burde nok ikke gi en 404, mens det andre kanskje burde det.

For kontekst: Denne siden består kun av to undersider. Fremsiden hvor omtrent det eneste man ser er en søkeboks, og resultatsiden som viser elementene tilknyttet det man skrev inn. Og det man søker i er en uttømmende liste begrensede, klare kategorier, hvor det kun er antallet som gjør at en nedtrekksmeny er uegnet. I mitt tilfelle slår man opp kommuner, men det kunne i prinsippet vært hva som helst. Poenget er at det er mer et oppslag enn et vanlig søk, men at det er mulig å slå opp noe som ikke finnes.

Sitat av Dyret Vis innlegg
Edit: Angående biten for å gjøre om GETen så det ikke "synes" i adressefeltet, så fikser mod_rewrite dette også. Vanligvis med en 301 internt. For eksempelet over så er det noe sånn som det her (bare fra hukommelsen, ikke testet)
Vis hele sitatet...
Ok, det vil løse mye. Jeg forestilte meg at man kunne ende i en rewrite loop om man hadde en regel for å skrive om example.com/foo til example.com/index.php?bar=foo og en som i bunn og grunn gjør det motsatte. Men ettersom den ene redirecter, og den andre ikke, så går det vel bra.
Sitat av Provo Vis innlegg
Det er egentlig det jeg tenker også. Derfor kunne det kanskje vært ønskelig å skille mellom om noen har skrevet "Fjas" i søkefeltet, og derfor blitt sendt til example.com/Fjas, som ikke gir treff, eller om de har tastet inn URLen example.com/Fjas. Det første burde nok ikke gi en 404, mens det andre kanskje burde det.

For kontekst: Denne siden består kun av to undersider. Fremsiden hvor omtrent det eneste man ser er en søkeboks, og resultatsiden som viser elementene tilknyttet det man skrev inn. Og det man søker i er en uttømmende liste begrensede, klare kategorier, hvor det kun er antallet som gjør at en nedtrekksmeny er uegnet. I mitt tilfelle slår man opp kommuner, men det kunne i prinsippet vært hva som helst. Poenget er at det er mer et oppslag enn et vanlig søk, men at det er mulig å slå opp noe som ikke finnes.


Ok, det vil løse mye. Jeg forestilte meg at man kunne ende i en rewrite loop om man hadde en regel for å skrive om example.com/foo til example.com/index.php?bar=foo og en som i bunn og grunn gjør det motsatte. Men ettersom den ene redirecter, og den andre ikke, så går det vel bra.
Vis hele sitatet...
Om noen skriver inn noe i et søkefelt og du ikke finner resultater til dem er det mer vanlig å returnere en "Ingen resultater samsvarer med ditt søkeord" eller lignende.

Om jeg tolker det riktig er det et søk hvor du ønsker å ta brukeren direkte til en artikkel om det bare er ett resultat. Du må tenke på om du ønsker at urlen skal reflektere innholdet (med tanke på deling o.l.). Alternativt kan du la søket returnere søkeresultatene og la brukeren selv klikke seg inn på resultatet.
Sitat av Yochi Vis innlegg
Om noen skriver inn noe i et søkefelt og du ikke finner resultater til dem er det mer vanlig å returnere en "Ingen resultater samsvarer med ditt søkeord" eller lignende.
Vis hele sitatet...
Det er jeg klar over.

Sitat av Yochi Vis innlegg
Om jeg tolker det riktig er det et søk hvor du ønsker å ta brukeren direkte til en artikkel om det bare er ett resultat. Du må tenke på om du ønsker at urlen skal reflektere innholdet (med tanke på deling o.l.). Alternativt kan du la søket returnere søkeresultatene og la brukeren selv klikke seg inn på resultatet.
Vis hele sitatet...
Nei, nå tror jeg kanskje du ikke leste alle innleggene over. Eller kanskje jeg har vært for utydelig.

I mitt konkrete tilfelle gjør man oppslag på kommune. Man skriver inn navnet på en kommune, og får deretter opp en liste virksomheter av en bestemt art som er tilknyttet den kommunen. Om man skriver inn "Hamar" er det liten vits i å liste opp Hamar som et treff man så klikker seg inn på. Usikkerheten rundt 404 angikk følgende:

Før rewriting, er det slik at om man skriver inn "Hamar", kommer man til example.com/results.php?kommune=Hamar, som lister opp virksomhetene tilknyttet Hamar. Dersom man skriver "Potet" kommer man til example.com/results.php?kommune=Potet, som opplyser om at det ikke finnes noen kommune som heter Potet. Og dersom man manuelt skriver inn en URL som ikke finnes, får man en 404.

Etter rewriting, blir det slik at om man skriver inn "Hamar", kommer man til example.com/Hamar, som lister opp virksomhetene tilknyttet Hamar. Dersom man skriver "Potet" kommer man til example.com/Potet som opplyser om at det ikke finnes noen kommune som heter Potet. Og dersom man manuelt skriver inn en URL som ikke finnes – gitt at URLen ikke har en lang sti – så vil det nødvendigvis tolkes som et oppslag på samme måte som om man skriver "Potet" i oppslagsboksen, og derfor ikke gi 404.

Dette er noe jeg helt fint kan leve med, men det er greit å vite om det finnes noen velbegrunnede meninger om hvordan det ellers bør gjøres.


Selve rewritingen tror jeg at jeg har kontroll på hvordan skal gjøres nå. Jeg gjør en rewrite fra example.com/Foo til example.com/results.php?kommune=Foo, og en 301-redirect fra example.com/results.php?kommune=Foo til example.com/Foo. Og i tillegg lar jeg javascript catche form submission, slik at i stedet for å poste form til results.php?kommune=Foo som deretter redirecter og gir to requests, så går den direkte til example.com/Foo – på den måten er det kun om man har javascript avskrudd at man generer to requests i stedet for en. Det hele kompliseres littegrann av at enkelte kommuner deler navn og derfor må ha fylke spesifisert, men det skal være overkommelig.