URL's rewriten

Plaats reactie
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16609
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 564 keer
Bedankt: 759 keer
Contacteer:

Ik heb een vrij lastig vraagje ivm apache web server.
Ik weet dat het kan, ik weet wat ik nodig heb, maar hoe het precies moet is een beetje moeilijk :-)

Ik wil dus deze situatie oplossen:
Een bezoeker typt
http://www.server.com/dit/is/een/deeplink
dat zou ik willen rewriten naar iets in de vorm http://www.server.com/?dit_is_een_deeplink

op zich gebeurt er niet veel: slashes worden vervangen door een underscore en er wordt een vraagteken voor gezet.

Dat is op te lossen via een aangepaste .htaccess en gebruik te maken van mod_rewrite.
Info daarover vind je op http://httpd.apache.org/docs/mod/mod_rewrite.html

Dat moet opgelost worden met reguliere expressies, iets waar ik niet veel van begrijp.

Ook ben ik niet zeker wat ik moet gebruiken van de opties.

Ik vermoed dat je dus eerst zal moeten controleren op het bestaan van een vraagteken in de url en zo nee die regel uitvoeren die de tekens omzet.

Nu is mijn vraag ... hoe?
Gebruikersavatar
dis.pater
Starter Plus
Starter Plus
Berichten: 44
Lid geworden op: 30 mei 2003, 17:44
Contacteer:

Met een rewrite weet ik het zo niet meteen, een andere methode is dmv een aangepaste 404.
Dit werkt ook, in je index.php (of een andere file die als index staat), kun je dan desgewenst een echt 404 oproepen door 404.php?error=true aan te roepen.

.htaccess
ErrorDocument 404 /404.php

404.php

Code: Selecteer alles

<?php
error_reporting(E_ALL);

if( !isset($_GET["error"]) ) {
   header("HTTP/1.1 200 OK");
   header("Status: 200 OK", TRUE, 200);

   $url = substr($_SERVER["REQUEST_URI"], 1); //Eerste slash weghalen
   $url = $url[strlen($url)-1] == "/" ? substr($url, 0, strlen($url)-1) : $url; //eventuele laatste slash weghalen
   $url = str_replace("/", "_", $url);

   header("Location: http://www.server.com/?$url");
} else {
   header("HTTP/1.1 404 Not Found");
   header("Status: 404 Not Found", TRUE, 404);

   // . . .
}
?>
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16609
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 564 keer
Bedankt: 759 keer
Contacteer:

Hm... dit is interessant. Ik had ook wel al even richting 404 gedacht, maar omdat ik ondertussen weet dat ik geen htaccess kan gebruiken voor errordocuments had ik dat idee een beetje laten varen.

Ik heb het eens op de test-server geprobeerd, het werkt nog niet volledig, maar ik moet er nog wat debug-code in smijten om te kijken wat er juist gebeurt, ik krijg namelijk altijd m'n 404-page tegen m'n neus geduwd :-) (eentje gegenereerd vanuit de index.php).

Nu het verschil van dit met mod_rewrite is dat bij rewrite de url in z'n mappen-vorm blijft staan, nu redirect ge eigenlijk naar een andere url (niet dat dat erg is overigens ;-)).

Bedankt dis.pater! Ik ga met dit idee nog eens wat verder zitten spelen een van dezer dagen. Héél fel bedankt :-)
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16609
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 564 keer
Bedankt: 759 keer
Contacteer:

Ik bedenk niet dat dit een heel goed idee is, maar dat gaat niet werken denk ik...

Mja, het probleem is dat 404-pagina's bij Dommel een soort redirect zijn. Allé, normaal blijft de URL staan en krijgt ge de inhoud van uw gedefinieerde 404-pagina als inhoud. Maar in dit geval wordt ge geredirect echt naar uw 404.php, en als zoiets gebeurt kunt ge niet meer te weten komen wat in url stond eh ...

Allé, ik vermoed toch dat ik dit als probleem ga tegen komen, kijk maar eens naar www.anigraphics.be/dit/bestaat/niet (let op de url).

Volgens mij ken jij wel iets van die dingen, ik heb de vhosts.conf hier onder eventjes geplakt, misschien dat jij er iets in kan zien dat handig kan zijn (of verduidelijkend).

VirtualDocumentRoot /usr/local/psa/home/vhosts/anigraphics.be/httpdocs/%1
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/cgi-bin*
RewriteRule ^(.*) /usr/local/psa/home/vhosts/anigraphics.be$1 [L,T=application/x-httpd-cgi]
RewriteCond %{REQUEST_URI} ^/error_docs*
RewriteRule ^(.*) /usr/local/psa/home/vhosts/anigraphics.be$1 [L]
RewriteCond %{REQUEST_URI} ^/~(([a-z])[a-z0-9]+)(.*)
RewriteRule ^/~(([a-z])[a-z0-9]+)(.*) /usr/local/psa/home/vhosts/anigraphics.be/web_users/$1/$3 [L]
RewriteCond %{HTTP_HOST} ^anigraphics.be* [OR]
RewriteCond %{HTTP_HOST} ^193.109.* [OR]
RewriteCond %{HTTP_HOST} ^www.anigraphics.be*
RewriteRule ^(.*) /usr/local/psa/home/vhosts/anigraphics.be/httpdocs$1
AddType application/x-miva-compiled .mvc
AddType application/x-miva-compiled .mv
Action application/x-miva-compiled /cgi-bin/mivamvc/mivavm
<Directory "/usr/local/psa/home/vhosts/anigraphics.be/cgi-bin">
Options ExecCGI
</Directory>
ErrorDocument 400 http://www.anigraphics.be/error/400.php
ErrorDocument 403 http://www.anigraphics.be/error/403.php
ErrorDocument 404 http://www.anigraphics.be/error/404.php
ErrorDocument 500 http://www.anigraphics.be/error/500.php
Gebruikersavatar
dis.pater
Starter Plus
Starter Plus
Berichten: 44
Lid geworden op: 30 mei 2003, 17:44
Contacteer:

Je wordt geredirect omdat je een url opgeeft, als je een 'gewoon' pad opgeeft wordt enkel die 404 weergegeven, maar blijft de url wel staan.
Als je dit gebruikt "ErrorDocument 400 /error/400.php" zou apache normaal wel die referrers moeten doorgeven.

Als je print_r($_SERVER) doet zou je die moeten zien staan.

edit:
Of kun je zelf die error documents niet opgeven in Dommels plesk implementatie?

edit2:

Die 404.php die ik daarnet postte mankeert nog wat, zo zou het beter moeten zijn.
urldecode ontbrak nog, ook heb ik nu de warnings van header onderdrukt, die tweede header (met status) geeft op soms een fout (wrong parameter count, nochtans klopt het, maar soit).

Code: Selecteer alles

<?php
error_reporting(E_ALL);

if( !isset($_GET["error"]) ) {
   @header("HTTP/1.1 200 OK");
   @header("Status: 200 OK", TRUE, 200);

   $url = substr($_SERVER["REQUEST_URI"], 1); //Eerste slash weghalen
   $url = $url[strlen($url)-1] == "/" ? substr($url, 0, strlen($url)-1) : $url; //eventuele laatste slash weghalen
   $url = str_replace("/", "_", $url);
   $url = urldecode($url);

   @header("Location: http://www.lunitechs.com/?p=$url");
} else {
   @header("HTTP/1.1 404 Not Found");
   @header("Status: 404 Not Found", TRUE, 404);

   echo "File not found.";
}
?>
Gebruikersavatar
dis.pater
Starter Plus
Starter Plus
Berichten: 44
Lid geworden op: 30 mei 2003, 17:44
Contacteer:

Moeten die slashes per se underscores worden?

Als dat geen vereiste is, kun je deze simpele rewrite gebruiken:

Code: Selecteer alles

RewriteEngine On

RewriteRule (.*) http://www.anigraphics.com/?$1
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16609
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 564 keer
Bedankt: 759 keer
Contacteer:

Dommel zei dat dit wel kon, maar dan kon ge geen aangepaste errorpages meer hebben op de subdomeinen. (ik weet niet of dat waar is).

zelf de errorpages gaat niet in plesk :(

Ja, die header error klopt niet echt, volgens http://be2.php.net/header : int header ( string string [, bool replace [, int http_response_code]]) is dat toch correct? Ik had om het op te lossen gewoon de 2 laatste parameters weggelaten.

Ivm die underscores; dat is een unieke id in de database eigenlijk, bijvoorbeeld "afvalbeleid_retour_toekomst" ik had daar underscores gebruikt om geen tekens te gebruiken die problemen zouden kunnen veroorzaken.

Die rewriterule lijkt een oneindige loop te veroorzaken.

Maar ik denk dat die oplossing met de 404 die de url opvangt eigenlijk de beste is, want dan zouden alle échte submappen ook worden omgezet in een variabele (toch?).

Je 404.php lijkt nog niet te werken, ik ga dadelijk eens wat debugcode gaan toevoegen aan m'n index en m'n 404.inc.php ;-)
Gebruikersavatar
dis.pater
Starter Plus
Starter Plus
Berichten: 44
Lid geworden op: 30 mei 2003, 17:44
Contacteer:

Hmm, hier werkt die wel nochtans.

Ik heb nog het één en ander opgezocht, in principe kun je dit doen met mod_rewrite met een externe rewrite map.

Ik ben zoiets aan het testen nu, maar er is nog een probleempje met de perl, maar dan nog bestaat de kans dat dommel die heeft uitgeschakeld.

edit:
Als die rewrite rule een infinite loop veroorzaakt bestaat de kans dat rewriten is uitgeschakeld, bij mijn ene host heb ik ook een infinite loop bij rewrites en daar is ie uitgeschakeld.
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16609
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 564 keer
Bedankt: 759 keer
Contacteer:

Ja, ik heb als testing server die van school gebruikt:
http://cmdstud.khlim.be/~cpeeters/test/rmz/

De phpinfo(): http://cmdstud.khlim.be/~cpeeters/phpinfo.php

Daar draait momenteel zowat volledig uw code voor de errors.

De uiteindelijke url zal natuurlijk op een traditioneel domein zijn.

Edit: dus wat er denk ik gebeurt als je bvb http://cmdstud.khlim.be/~cpeeters/test/rmz/organisatie intypt:
de errordocument vangt dat op, gaat naar 404.php, die stuurt dat naar een url die ik niet weet en de index redirect naar een 404-page omdat de pagina opgevraagd in de url niet in de database voorkomt.

Ik ga nu eens even de 404.php naar een test-file laten gaan, kijken wat
er eigenlijk gebeurt.

Edit: oooh dom :-)
Niet aan gedacht in al mijn furore :-) Ik zit natuurlijk al aardig wat mappen diep eh! Damn, dommerik dat ik ben!

Oké, dus die code werkt eigenlijk, maar pas gebruiken op de echte server. Lol, gewoon compleet geen rekening mee gehouden.
Nu hopen dat dat bij dommel met die rare 404-toestanden gaat werken...

Alvast bedankt voor de uitgebreide moeite, dis.pater!
Gebruikersavatar
dis.pater
Starter Plus
Starter Plus
Berichten: 44
Lid geworden op: 30 mei 2003, 17:44
Contacteer:

Als je dus gaat naar een pad die niet voorkomt op kouw domein.
Wordt dat ErrorDocument 404.php opgeroepen, die gaat naar eender welke pagina die jij wilt met daaraan een get-var met als waarde oorspronkelijke url.

Dit werkt dus enkel als er een 404 optreedt, je zult dus moeten zorgen, als je deze werkwijze gebruikt, dat de mappen niet kunnen overlappen met de gewenste verwijzingen.

Die urldecode die ik er eerst niet had en dan wel weer was eigenlijk toch overbodig :roll:
Ik moet even aan het dolen geweest zijn :P

edit:
ge zijt er dus al uit :)
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16609
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 564 keer
Bedankt: 759 keer
Contacteer:

Hey dis.pater,

Ik heb je oplossing eindelijk eens kunnen uitproberen, en het werkt toch nog niet volledig, en het is me een raadsel waarom.

Als je bvb deze url neemt: http://193.109.187.195/inwoners/prevent ... nkooptips/ krijg je een 404 (gaat via 404.php -> index.php -> ?404)

Vreemd genoeg werkt het wel voor 2 niveau's diep, maar niet voor dieper. Ook de laaste slash gooit roet in het eten.

heb jij enig idee wat dat kan zijn, want ik vind geen 'fout' in je code die dat zou kunnen veroorzaken...

als ik $url echo krijg ik netjes inwoners_preventie_winkelen_aankooptips , dus er moet nog iets anders fout lopen, enig idee wat?
Gebruikersavatar
dis.pater
Starter Plus
Starter Plus
Berichten: 44
Lid geworden op: 30 mei 2003, 17:44
Contacteer:

Hmm niet meteen, ff zien :)

Ik heb ook een oplossing die werkt met rewrites, ik heb zelf net contact opgenomen met dommel met de vraag of ze die kunnen activeren van zodra ik antwoord heb en heb kunnen testen post ik deze hier ook.
Gebruikersavatar
dis.pater
Starter Plus
Starter Plus
Berichten: 44
Lid geworden op: 30 mei 2003, 17:44
Contacteer:

Hmm wat gaat er precies niet?
Ik snap het blijkbaar niet, ik heb het getest en het werkt :S

http://www.lunitechs.org/ik/ben/een/kip/ja/dat/ben/ik/
Wordt veranderd in
http://www.lunitechs.org/?p=ik_ben_een_ ... dat_ben_ik
airzimmy
Erelid
Erelid
Berichten: 1047
Lid geworden op: 19 sep 2002, 14:01
Contacteer:

Op die laatste url krijg ik een redirection limit ...
Gebruikersavatar
dis.pater
Starter Plus
Starter Plus
Berichten: 44
Lid geworden op: 30 mei 2003, 17:44
Contacteer:

Nu niet meer normaal gezien :)
Lukse
Premium Member
Premium Member
Berichten: 662
Lid geworden op: 28 okt 2003, 20:51

Klein probleempje hierbij:
Ik heb een link die naar http://site/gastenboek verwijst en dus doorgelinkt moet worden naar http://site/?gastenboek
Het probleem is nu dat het bestand gastenboek.php bestaat, en ik daar terechtkom.
Hij gaat dus niet naar de 404.php
Iemand een idee hoe ik dat kan oplossen?
ubremoved_539
Deel van't meubilair
Deel van't meubilair
Berichten: 29849
Lid geworden op: 28 okt 2003, 09:17
Uitgedeelde bedankjes: 446 keer
Bedankt: 1985 keer

Kan je gewoon de oorzaak van het probleem niet oplossen, ipv. de gevolgen ? Maw. waarom heb je dergelijk gekke URLs met vraagtekens erin ?
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16609
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 564 keer
Bedankt: 759 keer
Contacteer:

Een andere naam geven?
/gboek of zo?
Of je gastenboek.php gastenboek2.php noemen of zo?
Gebruikersavatar
dis.pater
Starter Plus
Starter Plus
Berichten: 44
Lid geworden op: 30 mei 2003, 17:44
Contacteer:

Lukse schreef:Klein probleempje hierbij:
Ik heb een link die naar http://site/gastenboek verwijst en dus doorgelinkt moet worden naar http://site/?gastenboek
Het probleem is nu dat het bestand gastenboek.php bestaat, en ik daar terechtkom.
Hij gaat dus niet naar de 404.php
Iemand een idee hoe ik dat kan oplossen?

Hmmm ik ben niet helemaal mee vrees ik :)
/gastenboek is nl. niet gelijk aan /gastenboek.php dus is dat heel bizar als je op gastenboek.php zou terechtkomen, tenzij je een rewrite/redirect hebt natuurlijk :)
Lukse
Premium Member
Premium Member
Berichten: 662
Lid geworden op: 28 okt 2003, 20:51

Ik vind het ook raar, maar dat is dus exact wat er gebeurt.
Kheb alleen nen .htaccess met ErrorDocument in, voor de rest niks aangepast.
Plaats reactie

Terug naar “Development”