Pagina 1 van 1
					
				URL's rewriten
				Geplaatst: 30 aug 2003, 13:12
				door meon
				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?
 
			
					
				
				Geplaatst: 10 sep 2003, 18:52
				door dis.pater
				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);
   // . . .
}
?>
 
			
					
				
				Geplaatst: 10 sep 2003, 19:42
				door meon
				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 

 
			
					
				
				Geplaatst: 10 sep 2003, 20:10
				door meon
				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
 
			
					
				
				Geplaatst: 10 sep 2003, 21:15
				door dis.pater
				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.";
}
?>
 
			
					
				
				Geplaatst: 10 sep 2003, 21:45
				door dis.pater
				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
 
			
					
				
				Geplaatst: 10 sep 2003, 22:45
				door meon
				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 

 
			
					
				
				Geplaatst: 10 sep 2003, 23:17
				door dis.pater
				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.
			 
			
					
				
				Geplaatst: 10 sep 2003, 23:31
				door meon
				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!
 
			
					
				
				Geplaatst: 10 sep 2003, 23:45
				door dis.pater
				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  
 
 
Ik moet even aan het dolen geweest zijn  
 
edit:
ge zijt er dus al uit 

 
			
					
				
				Geplaatst: 28 sep 2003, 21:45
				door meon
				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?
 
			
					
				
				Geplaatst: 29 sep 2003, 18:30
				door dis.pater
				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.
 
			
					
				
				Geplaatst: 30 sep 2003, 14:16
				door dis.pater
				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 
			
					
				
				Geplaatst: 30 sep 2003, 15:51
				door airzimmy
				Op die laatste url krijg ik een redirection limit ...
			 
			
					
				
				Geplaatst: 30 sep 2003, 15:58
				door dis.pater
				Nu niet meer normaal gezien 

 
			
					
				
				Geplaatst: 21 jun 2004, 11:51
				door Lukse
				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?
 
			
					
				
				Geplaatst: 21 jun 2004, 12:02
				door ubremoved_539
				Kan je gewoon de oorzaak van het probleem niet oplossen, ipv. de gevolgen ?  Maw. waarom heb je dergelijk gekke URLs met vraagtekens erin ?
			 
			
					
				
				Geplaatst: 21 jun 2004, 13:02
				door meon
				Een andere naam geven?
/gboek of zo?
Of je gastenboek.php gastenboek2.php noemen of zo?
			 
			
					
				
				Geplaatst: 21 jun 2004, 19:17
				door dis.pater
				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 

 
			
					
				
				Geplaatst: 21 jun 2004, 19:50
				door Lukse
				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.