[PHP] URL rewriting icm base path

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Vinze
  • Registratie: Augustus 2006
  • Laatst online: 17-09 22:14
Ik ben vandaag begonnen met het opzetten van een nieuwe portfolio website, nu wil ik deze geheel vanaf de grond opbouwen en ook alles zo netjes mogelijk doen. Hier hoort uiteraard ook een mooie url rewrite bij.

Nu heb ik de volgende structuur bedacht voor het rewriten:
/portfolio/index.php?p=weblog&a=addmsg
/portfolio/index.php?p=guestbook&a=view&id=23
etc..

Vervolgens staat in mijn .htaccess bestand het volgende:
code:
1
2
3
RewriteEngine On
RewriteRule ^(.*)/(.*)/(.*) /portfolio/index.php?p=$1&a=$2&id=$3
RewriteRule ^(.*)/(.*) /portfolio/index.php?p=$1&a=$2


En met php include ik de juiste pagina in index.php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if(isset($_GET['p']) OR ($_GET['a'])) {
    $path = strtolower("pages/{$_GET['p']}/{$_GET['a']}.php");
    if(file_exists($path)) {
        include ($path);
    }
    else {
        echo "<b>Fout:</b> Pagina niet gevonden!";
    }
}
else {
    include("pages/start.php");
}
?>


Dus de link wordt dan: http://localhost/portfolio/weblog/addmsg

Dit lijkt allemaal goed te gaan op 1 ding na: mijn base doet het niet meer.
Ik heb het base path in een config.php bestand staan welke bovenin de index ge-include wordt.
Daarna heb ik in de header het volgende staan: <base href="<?php echo $root; ?>" />
$root = "http://localhost/portfolio/";

Alleen wanneer ik nu in de broncode kijk, zie ik dat er het volgende staat: <base href="" /> (leeg dus..)
Daardoor werkt mijn link naar het stylesheet niet meer (href="style/stylesheet.css") en doen afbeeldingen het niet meer. Wanneer ik de URL niet dmv een variabele invul bij de base werkt het wel naar behoren, iemand enig idee hoe dit komt?

En is de manier van pagina's includen zo goed, of zijn er betere methodes hiervoor? Deed dit 'vroeger' altijd met een switch statement, alleen dan moest je voor iedere nieuwe pagina de switch weer uitbreiden.

Acties:
  • 0 Henk 'm!

Verwijderd

Ik had dit probleem eerst ook. En ik had dit opgelost door overal een slash voor te zetten, dus href="/style/stylesheet.css". Dit werkte, maar er zal wel een betere oplossing voor zijn.

Acties:
  • 0 Henk 'm!

  • Vinze
  • Registratie: Augustus 2006
  • Laatst online: 17-09 22:14
Oké nevermind, hele ochtend aan het zoeken, en 20 min nadat ik dit gepost heb de oplossing gevonden.
Voor de mensen die hier nog mee zitten, zet dit bovenin je .htaccess bestand:
code:
1
2
RewriteEngine On
RewriteRule ^(dir1|dir2) - [L]


dir1 & dir2 zijn de mappen welke uitgesloten moeten worden van een mod_rewrite gescheiden door een | .

Om dit topic dan niet voor niks gemaakt te hebben, is deze manier van pagina's includen goed/veilig? Zijn er eventuele betere/nettere manieren?

Acties:
  • 0 Henk 'm!

  • X_lawl_X
  • Registratie: September 2009
  • Laatst online: 09:07
Vinze schreef op vrijdag 07 januari 2011 @ 14:14:
Oké nevermind, hele ochtend aan het zoeken, en 20 min nadat ik dit gepost heb de oplossing gevonden.
Voor de mensen die hier nog mee zitten, zet dit bovenin je .htaccess bestand:
code:
1
2
RewriteEngine On
RewriteRule ^(dir1|dir2) - [L]


dir1 & dir2 zijn de mappen welke uitgesloten moeten worden van een mod_rewrite gescheiden door een | .

Om dit topic dan niet voor niks gemaakt te hebben, is deze manier van pagina's includen goed/veilig? Zijn er eventuele betere/nettere manieren?
Als ik er even snel doorheen kijk is het niet veilig. Als je het op deze manier doet zou ik een array maken met toegestane bestanden.

PHP:
1
2
3
4
5
6
7
<?php
$good = array('bestand1.php', 'bestand2.php');

if ( ! in_array($_GET['a'], $good))
{
    die('Ga weg!');
}


Anders kunnen er ook directory separators meegegeven worden in de parameters, waardoor er ook andere bestanden in andere mappen geïnclude kunnen worden.

Als je het netter wilt doen kun je beter met Controllers en Actions werken. Google maar eens op MVC pattern.

[ Voor 19% gewijzigd door X_lawl_X op 07-01-2011 14:51 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik heb voor het gemiddelde project maar 3 regels nodig voor al mijn rewrites.
code:
1
2
3
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Mijn PHP-file handelt verder wel af wat er verder moet gebeuren. Voorkom je meteen ook dat je voor elke nieuwe module of folder je .htaccess moet lopen aanpassen.

En zoals boven me al gezegd wordt: include nooit maar dan ook echt NOOIT bestanden die uit user input komen. '../../../../etc/passwd?' invullen kan niet de bedoeling zijn...

[ Voor 20% gewijzigd door NMe op 07-01-2011 14:50 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Nu online
Vinze schreef op vrijdag 07 januari 2011 @ 14:14:
Om dit topic dan niet voor niks gemaakt te hebben, is deze manier van pagina's includen goed/veilig? Zijn er eventuele betere/nettere manieren?
Nee het is niet veilig. Het is mogelijk om een PHP-bestand te includen waarvan jij niet wilt dat dat gebeurt.

Ik heb je scriptje gekopieerd en geplaatst in /home/rutgerw/public_html/tmp/got.php. De url is dan
code:
1
http://localhost/~rutgerw/tmp/got.php
. Als ik die aanroep met:
code:
1
http://localhost/~rutgerw/tmp/got.php?p=../../../../&a=/home/rutgerw/public_html/geheim/wisalles
dan wordt /home/rutgerw/public_html/geheim/wisalles.php geinclude.

[ Voor 0% gewijzigd door Kalentum op 07-01-2011 14:53 . Reden: typo ]


Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Zoals al eerder gezegd, niet doen dus. Gebruik de oplossing van NMe, die zorgt dat alles op index.php uitkomt, tenzij het bestand bestaat.

Gebruik in php vervolgens $_SERVER['REQUEST_URI']; en haal hier het pad wat aangeroepen is uit.

als je <base ... /> op die manier gebruikt werkt het buggy in sommige browsers (1x raden welke). Gebruik daarom liever: <base ...></base> Hoe je $root variable leeg komt kan ik met de informatie die je nu gegeven hebt niet zeggen.

[ Voor 0% gewijzigd door ReenL op 07-01-2011 17:23 . Reden: Nederlands ]


Acties:
  • 0 Henk 'm!

Verwijderd

ReenL schreef op vrijdag 07 januari 2011 @ 17:23:
Zoals al eerder gezegd, niet doen dus. Gebruik de oplossing van NMe, die zorgt dat alles op index.php uitkomt, tenzij het bestand bestaat.

Gebruik in php vervolgens $_SERVER['REQUEST_URI']; en haal hier het pad wat aangeroepen is uit.

als je <base ... /> op die manier gebruikt werkt het buggy in sommige browsers (1x raden welke). Gebruik daarom liever: <base ...></base> Hoe je $root variable leeg komt kan ik met de informatie die je nu gegeven hebt niet zeggen.
Ik zou dan persoonlijk voor de volgende oplossing kiezen:
HTML:
1
<base href="http://tweakimg.net/g/forum/"><!--[if lte IE 6]></base><![endif]-->


Ja, dat komt uit de source van déze pagina. :+

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 13:10

Matis

Rubber Rocket

Kijk ook eens naar crisp in "[htaccess] Samenstelling topic url"

Hoe dat ze op GoT de rewriterules icm multiview hebben opgelost.

If money talks then I'm a mime
If time is money then I'm out of time

Pagina: 1