Avatar billede zaittam Nybegynder
17. juli 2007 - 09:22 Der er 20 kommentarer og
1 løsning

mod_rewrite med MySQL?

Hej eksperter!

Jeg har surfet på nettet i et par timer uden et resultat der virker - så nu prøver jeg her.

Jeg har udviklet en CMS-løsning, og vil gerne lave nogle "pæne URLer" til mine websites. Lige nu kaldes alle undersider via index.php?id=$1.

I MySQL-tabellen "sider" har jeg to felter der skal bruges her. Det ene hedder id, der bruges til at kalde siden igennem index.php, det andet hedder nickname, som jeg gerne vil have, skal være dens URL.

Eks:
Feltet id indeholder tallet 12.
Feltet nickname for samme række indeholder teksten "support".

Jeg vil gerne have mod_rewrite (eller en anden løsning, der fungerer lige så godt??) til at gøre således:

Brugeren kalder www.domæne.dk/support - og siden www.domæne.dk/index.php?id=12 vises. Jeg har et script i en .htaccess fil der kan gøre dette ganske let - men jeg kan ikke få det til at hænge sammen med MySQL!

Scriptet ser således ud:

RewriteEngine on
RewriteRule ^support$ /support/ [R]
RewriteRule ^support/$ /index.php?id=12

Findes der en løsning? Jeg orker ikke at sidde og oprette disse 2 linier manuelt i min .htaccess fil hver gang jeg opretter en side i mit CMS.
Avatar billede zaittam Nybegynder
17. juli 2007 - 09:23 #1
Jeg er i øvrigt flere gange stødt på dette forum i min søgen, men jeg kan ikke få det til at virke heller:

http://www.thescripts.com/forum/thread631658.html
Avatar billede sone Nybegynder
17. juli 2007 - 09:52 #2
mod_rewrite kan ikke lave mySQL opslag.
Det bedste du kan få ud (så vidt jeg ved) er at få mappet /support til /index.php?nick=support
Avatar billede zaittam Nybegynder
17. juli 2007 - 10:02 #3
Det skal jo fortsat gøres manuelt så - og så er jeg jo lige vidt.

Kan det mon lade sig gøre at få mod_rewrite til at kigge i en txt fil eller lignende?

Den kunne for eksempel indeholde følgende:

1 | forside
2 | sjovt
3 | usjovt
12 | support

og så omskriver den selv det til at den skal omskrive support til index.php?id=12 ?
Avatar billede erikjacobsen Ekspert
17. juli 2007 - 10:12 #4
Det du linker til kan man ikke gøre i en .htaccess - kun i httpd.conf

Lad php-scriptet om at lave navn til tal, eller hvad der skal gøres, sådan ca.

RewriteRule ^(.*)/?$ /index.php?navn=$1
Avatar billede zaittam Nybegynder
17. juli 2007 - 11:20 #5
Godt tænkt, erik!

Det må jeg teste når jeg lige har fået lidt frokost :)
Avatar billede zaittam Nybegynder
17. juli 2007 - 11:40 #6
Hm.. Det giver godt nok lidt noget bongo!

Nu omskriver den alle billeder til at hente fra index.php?name=$1 også ;) Det var jo ikke meningen...
Avatar billede zaittam Nybegynder
17. juli 2007 - 11:43 #7
For at give et eksempel tættere på det jeg rent faktisk har gang i, så:

brugeren går ind på www.domæne.dk/hosting/exchange

og sendes til www.domæne.dk?id=4

Rækken "Exchange hosting" i databasen hedder:
id | nickname
4  | hosting/exchange

Hvordan får jeg det til at fungere?

Jeg kan lave det på den måde jeg gjorde det før:

RewriteRule ^hosting/exchange$ /hosting/exchange/ [R]
RewriteRule ^hosting/exchange/$ /index.php?id=4
Avatar billede erikjacobsen Ekspert
17. juli 2007 - 11:59 #8
Dine rewrite-regler skal selvfølgelig kunne skelne en billed-url fra en ikke-billed-url.
Det jeg har skrevet er kun en lille del af hvad der skal til. Fx kun omskrive hvis der ikke linkes til en eksisterende fil.
Avatar billede zaittam Nybegynder
17. juli 2007 - 15:10 #9
Åh, sådan noget forstår jeg mig slet ikke på.

Jeg prøver at surfe lidt, - skriver hvad jeg finder ud af hvis ikke der kommer noget her.
Avatar billede erikjacobsen Ekspert
17. juli 2007 - 15:46 #10
Der kan sagtens komme noget her - så bøvlet er det nu heller ikke, men hvad har du af regler, i ord og eksempler?
Avatar billede zaittam Nybegynder
17. juli 2007 - 16:01 #11
De vil altid være opbygget på ovenstående måde.

Her kommer lidt eksempler:

id | nickname
1 | (tomt felt - dette er forsiden)
2 | konsulentbistand
3 | remote_backup
4 | hosting
5 | hosting/webhosting
6 | hosting/exchange
7 | hosting/hosted_server

Så har jeg vidst været omkring alle typer.

Jeg havde jo fat i: RewriteRule ^support$ /support/ [R] - før, hvor jeg omskriver adressen www.domæne.dk/support til www.domæne.dk/support/

Jeg går ud fra, at denne også kan laves så den gælder alle - på den måde kunne det måske være en regel, at alle sluttede på skråstregen? Eller også har I bedre ideer. Det er ikke lykkes mig at finde noget på nettet, så jeg håber jeg kan få hjælp her.
Avatar billede erikjacobsen Ekspert
17. juli 2007 - 16:14 #12
Og dine billeder etc?  Du skal kigge på RewriteCond for at sortere fra hvad der ikke skal omskrives.
Avatar billede zaittam Nybegynder
17. juli 2007 - 16:34 #13
Jeg kan ikke umiddelbart se hvordan jeg frasorterer, så alle filtyper ikke omskrives. Altså, hvis den requestede URL slutter på et filnavn, skal den ikke omskrives. Eventuelt kan den bare tjekke om filnavnendelsen er feks .gif, .jpg, .png, .pdf osv.
Avatar billede erikjacobsen Ekspert
17. juli 2007 - 17:05 #14
Nej, og vi kan jo ikke hjælpe, når du ikke vil fortælle hvordan din verden ser ud.

Men et standard "trick" er at bruge

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

til at sige at der ikke skal omskrives hvis der refereres en fil eller et katalog, der allerede findes på serveren.
Avatar billede michaelthomassen Nybegynder
18. juli 2007 - 03:05 #15
Hvad med en løsning hvor brugeren skriver www.domæne.dk/hosting/?nickname (læg mærke til spørgsmålstegnet)

Dette svarer jo til at skrive www.domæne.dk/hosting/index.php?nickname (hvis du ellers har index.php liggende), herefter kan du lave noget i denne retning;

foreach ($_GET as $var) {
//SELECT * FROM sider WHERE nickname = "$var"
//if found
//  redirect (www.domæne.dk/index.php?id=$row['id']);
//else
//  echo 'Beklager, siden blev ikke fundet';
}
Avatar billede zaittam Nybegynder
18. juli 2007 - 08:10 #16
micaelthomassen: På den måde får jeg det ikke fuldt ud automatiseret som jeg gerne vil have det. Hvis jeg en dag har lyst til at oprette en anden underside til en anden side, så skal jeg ind og lave en folder manuelt :) Det dutter jo ikke.

erikjacobsen: Tusind tak for din hjælp indtil nu. Det skrider fremad nu! Er det ikke nok med det eksempel jeg gav ovenover? :) Ellers sig til, så må vi finde ud af noget.

Er det tilladt at henvise til sin e-mail adresse herinde?

Situationen er lige nu sådan:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/?$ index.php?name=$1

Det fungerer ganske fortrinligt. Der er dog et par ændringer jeg gerne vil have gennemført. Alle mine nicknames er (som ovenstående dumb fra min database viser det) opdelt i et virtuelt mappesystem. Det fungerer udemærket nu - men jeg vil gerne have det lavet, så brugeren også kan gå ind på for eksempel www.domæne.dk/konsulentbistand/ - altså med skråstregen til sidst. Jeg har rodet lidt med min første kode, for at løse det, men det vil ikke rigtig lykkes for mig.

RewriteRule ^support$ /support/ [R]

Kan ikke lure hvordan jeg får det til at virke omvendt - altså fra skråstreg til ikke skråstreg - og så for alle mulige bogstavskombinationer..

Derudover en lidt sværere: Jeg læste på søgemaskineguruen www.demib.dk's hjemmeside, at det ikke duer med dobbelt-indeksering. Derfor må jeg også lave sådan en R-redirect hvis brugeren indtaster index.php?id=etellerandet - til den med nicknamet. Alternativt skal den med id'et bare give en 404. Kan det lade sig gøre, eller skal jeg bare skyde en hvid pil efter det?

Tusind tak for jeres hjælp!
Avatar billede zaittam Nybegynder
18. juli 2007 - 08:25 #17
Det første problem har jeg løst i min PHP-kode.. www.php.net/rtrim blev min bedste ven!

$_GET[name] = rtrim($_GET[name], "/");

Er der nogle herinde, som ved lidt om søgemaskiner, og som kan fortælle mig, om jeg skal være bange for den der dobbeltindeksering, når nu jeg har at gøre med et helt nyt website.. Der vil jo faktisk aldrig blive linket til siderne med index.php?id=xxx

Hvis ingen links der eksisterer på det, så finder Google og de andre det jo nok heller ikke.. Eller hvad?
Avatar billede erikjacobsen Ekspert
18. juli 2007 - 08:46 #18
Konstruktionen  "/?"  i  "RewriteRule ^(.*)/?$ index.php?name=$1"  betyder at "/" kan være der eller ikke være der. Men da ".*" er grådig (geeksnak om regulære udtryk...) vil den altid blive fanget dér. Prøv evt lige at: 

    RewriteRule ^(.*?)/?$ index.php?name=$1

Så skulle den "/" vist ikke komme med hvis jeg husker rigtigt, og du kan spare dit check i PHP-koden.

Nej, Google opfinder ikke selv links ;)  Og man skal ikke tro at Mikkel ved alt om søgemaskiner.
Avatar billede zaittam Nybegynder
18. juli 2007 - 09:16 #19
Jeps, du har ret. Det lille spørgsmålstegn løste problemet :)

Der er nok ikke nogen der ved alt om søgemaskiner, men han ved da en lille smule mere end jeg selv :) (hvis altså det er nogle rigige ting han siger ind imellem :))

Og man må jo søge hjælp hvor hjælp findes!

Lægger du lige et svar, så du kan få lidt point, erik? :)
Avatar billede erikjacobsen Ekspert
18. juli 2007 - 09:38 #20
Jeg samler slet ikke på point, tak.

Tænk på SEO både som "Search Engine Optimization", og som "SEcond Opinion" - altså tro aldrig på hvad én skriver, find bekræftelser flere steder!
Avatar billede zaittam Nybegynder
18. juli 2007 - 09:52 #21
Så må du nøjes med et Tusind tak for hjælpen :)

Og - det var et godt tip om SEO!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester