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?
URL's rewriten
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
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);
// . . .
}
?>
- meon
- 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
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
- meon
- 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).
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
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).
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.";
}
?>
Moeten die slashes per se underscores worden?
Als dat geen vereiste is, kun je deze simpele rewrite gebruiken:
Als dat geen vereiste is, kun je deze simpele rewrite gebruiken:
Code: Selecteer alles
RewriteEngine On
RewriteRule (.*) http://www.anigraphics.com/?$1
- meon
- 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
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
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.
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.
- meon
- 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!
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!
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
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
- meon
- 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?
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?
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.
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.
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
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
Op die laatste url krijg ik een redirection limit ...
Nu niet meer normaal gezien
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?
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?
-
- 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 ?
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