WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Modrewrite regler! (https://www.wn.se/forum/showthread.php?t=1041059)

Mystica 2010-03-20 11:50

Modrewrite regler!
 
Hej!

Jag blir inte klok på dessa modrewrite och revritecond m.m. jag undrar nu om ni kan hjälpa mig med regler.

Det jag vill är att när någon skriver eller länkar till en .php sida ex /sida.php?234=vdg eller /sida.php så skall modrewrite INTE skriva om någonting. men allting annat skall den skriva om (förutom själva / då) och peka till sida2.php för att läsa in urlen och se om jag kan få fram en vettig sida på det som är skrivet.

med andra ord skriv om allting som inte är en .php sida i urlen.

Tack på förhand :)

qson 2010-03-20 11:55

Citat:

Ursprungligen postat av Mystica (Inlägg 20347218)
Hej!

Jag blir inte klok på dessa modrewrite och revritecond m.m. jag undrar nu om ni kan hjälpa mig med regler.

Det jag vill är att när någon skriver eller länkar till en .php sida ex /sida.php?234=vdg eller /sida.php så skall modrewrite INTE skriva om någonting. men allting annat skall den skriva om (förutom själva / då) och peka till sida2.php för att läsa in urlen och se om jag kan få fram en vettig sida på det som är skrivet.

med andra ord skriv om allting som inte är en .php sida i urlen.

Tack på förhand :)

Om din Rewrite funkar i övrigt, men du vill plocka bort så just dessa inte skrivs om, lägg till följande RewriteCond:
Kod:

RewriteCond %{REQUEST_URI} !^/?(sida\.php\?234=vdg|sida.php)$
Ovanstående kommer matcha endast två uri-er: sida.php?234=vdg eller bara sida.php. Inga andra uri.er.
om du istället vill plocka bort alla uri-er som börjar med sida.php (vilket du inte skrev i frågan) kan du använda denna istället:
Kod:

RewriteCond %{REQUEST_URI} !^/?sida\.php
-

Upptäckte nu din sista rad, att du vill att den inte skall skriva om för alla php-filer:
Finns två sätt:
En att den inte matchar om det finns en fil med det namnet (vanligast):
Kod:

RewriteCond %{REQUEST_FILENAME} !-f
Annars kan du kolla om .php finns i filnamnet:
Kod:

RewriteCond %{REQUEST_URI} !^/?[^?]*\.php

Mystica 2010-03-20 13:52

Tack för ditt svar.

Det som verkar mest lovande är
RewriteCond %{REQUEST_FILENAME} !-f

Men om jag nu tar och skriver in en sådan tillsammans med en rewriterule som ex.
RewriteRule ^(.*) /analys.php [nc]

Nu blir det totalt knasigt om man skriver ex http://domän.com/
då blir det internal server error.

däremot om jag skriver http://domän.com/index.php så fungerar det fint.

min första tanke var att inan de där reglerna ovan lägga till en
RewriteRule ^ /index.php [nc]

Men det stökade till det hela ännu mer..

Så det som inte fungerar för mig är följande:
RewriteEngine On
RewriteRule ^ /index.php [nc]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) /analys.php [nc]
RewriteBase /

som sagt e stor nybörjare på detta och har säkerligen inte fått en rad rätt.

Fortfarande tacksam för hjälp

objx 2010-03-20 15:14

Jag kör själv med dessa regler på större delen av mina projekt:
Kod:

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

RewriteRule .*(\?.*) index.php$1 [QSA]
RewriteRule .* index.php [QSA]

Denna regel innebär att alla sökvägar som INTE är en fil ELLER en mapp hänvisas till index.php i samma katalog där .htaccess-filen ligger.

T.ex.
Ovanstående regler placeras i www.test.se/.htaccess.

www.test.se/bilder/minbild.jpg
Denna URL beter sig precis som vanligt (såvida filen minbild.jpg existerar).

www.test.se/artiklar/sokmotoroptimering.html
Eftersom varken mappen "artiklar" eller "sokmotoroptimering.html" existerar på servern så dirigeras denna fråga till www.test.se/index.php där jag sedan via PHP kontrollerar vad URL:en innehåller för mappar/filnamn/queries etc.

Jag vet inte om det svarade på din fråga riktigt, men du kanske får ut något av det i alla fall.

Mystica 2010-03-20 15:29

Detta verkar vara precis vad jag e ute efter. Skall testa lite och labba o se om det beter sig som jag vill :)

Tack för svaret :)

objx 2010-03-20 16:21

Gör så, du kan väl meddela hur det gick! :)

Mystica 2010-03-20 19:50

Topen!
 
Det fungerar ganska bra faktiskt :)

jag ändrade om i scriptet så det inte gick till index sidan då min struktur inte tycker om att jag kör det via index.php (går men omständigt) och det medför automatiskt att ex domän.com/ bara går direkt till fil som analyserar url'en. Detta är dock enkelt löst i den filen men annars fungerar det klockrent för mig :)

Tackar och bockar. Hade du sålt sådanna lösningar i förpackningar på apoteket så hade jag köpt många lådor för att förhindra huvudvärk.

objx 2010-03-21 00:25

haha! :)

Kul att det hjälpte dig!

Jag skrev en rätt behändig klass i PHP för att analysera en URL som är ett riktigt bra komplement till den där typen av htaccess-regler.
Den har t.ex. funktioner för att kontrollera domännamn, mappar, filnamn, queries etc.
Säg att du har följande adress:

www.test.se/produkter/mobiltelefoner.html

Klassen kan jag därefter använda på följande sätt:

$url = "www.test.se/produkter/mobiltelefoner.html";
(i normala fall så är ju $url en dynamisk variabel som alltid representerar aktuell URL)

$analyzed_url = new _url($url);

Därefter kan jag hämta information om URL:en på följande vis:

$mapp1 = $analyzed_url->getDir(1);
1:an representerar vilken mapp i turordningen som jag är ute efter, ex:
www.test.se/mapp1/mapp2/mapp3/ osv.

$mapp1 kommer nu alltså innehålla "produkter".

$filename = $analyzed_url->getFilename();
getFilename ger mig namnet på filnamnet ("mobiltelefoner.html" i detta fall)

$filenamebody = $analyzed_url->getFilenameBody();
Denna funktion ger mig filnamnet utan filändelsen ("mobiltelefoner" i sammanhanget).

Klassen har även en del andra funktioner som är rätt användbara.

Skicka ett PM om du är intresserad av att kolla på den så skickar jag över den.


Alla tider är GMT +2. Klockan är nu 05:34.

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