.htaccess rewrite

Status
Niet open voor verdere reacties.
Klopt...
Het genereert enkel een array ($path) met alles tussen de slashes in de URL. Kijk eens met print_r() naar de inhoud van die variabele. Elke deel tussen slashes vormt een element.
 
Kan dit niet zonder php gedeelte? alleen dit .htaccess gedeelte werkt in iedergevel niet
Dit hoort in php afgehandeld te worden.
Is er een speciale reden dat je dit in .htacces wilt doen?

Mijn oplossing werkt in ieder geval zonder problemen met de / in p=formule/uitleg
Ook werkt de oplossing met andere pagina mogelijkheden en met POST afhandeling.

Toch eens proberen?
 
Laatst bewerkt:
Met de huidige code van eht script die ik als laatste gaf ben je ook al een flink eind.
Eigenlijk zou je dan $path[0] of $path[1] (kijk even a.h.v. print_r) in een switch() moeten gooien, zodat je dan een mooie afhandeling hebt.
Bijvoorbeeld een include() die je dan uitvoert.
 
*** Voorbeeld

Stel dat index.php in subfolder 'abc' staat en je hebt het volgende linkje
<a href="https://www.example.nl/abc/formule/uitleg/aang.duur">LINKJE</a>
Code:
[B]*** .htaccess ***[/B]

RewriteEngine on
# gebruik / als index.php in root of /SUB als index.php in subfolder
RewriteBase /abc
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?page=$1 [QSA]

[B]*** index.php ***[/B]

$page = '';
$name = '';
if (!empty($_GET) && ($_SERVER['REQUEST_METHOD']=='GET')) {
  $arr = explode('/', $_GET['page']);
  if (count($arr) >= 3) {
    $page = rawurldecode($arr[0].'/'.$arr[1]);
    $name = rawurldecode($arr[2]);
  }
}
echo '<br>Page: ', $page;
echo '<br>Name: ', $name;
Noot: in jouw voorbeeld staat alles niet in subfolder /abc/ dus gebruik je in jouw geval RewriteBase /

In .htaccess om naar https te gaan
Code:
# RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Tip: gebruik in map- en bestandsnamen alleen letters, cijfers, '-' (minus) en '_' (underscore). Hiermee voorkom je debugwerk.

Suc6. Have fun.

ik typ de link site.nl/formule/uitleg/AANG.DUUR in dan opent hij wel een pagina, alleen is dit de index, maar dan zonder opmaak.
 
Laatst bewerkt:
Je bent met een nieuwe structuur aan het maken.
Bekijk vooral volgende eens het zal je veel tijd besparen.
Het script is niet getest en kan schrijffouten bevaten!
PHP:
<?php
spl_autoload_extensions('.php');
spl_autoload_register(function ($klasse) {
    try {
        $pad = ['include'];                     
        $klasse = str_replace('\\', DIRECTORY_SEPARATOR, $klasse);
        array_push($pad,$klasse.'.php');
        $pad = implode(DIRECTORY_SEPARATOR,$pad);
        if(file_exists($pad)&& is_readable($pad)){
            require_once  $pad;
        }
    } catch (Exception $e) {
        print_r($e);
    }
});
$object = new \directory\klassename();
$object->__toString();
//maak een bestand aan op de plaats ten opzichte van dit script 
//   ./include/directory/klassename.php
/* content...
class klassename{
    public function __toString(){
        print "Hello World";
    }
}

*/
?>
 
Mijn script #24 heb ik werkend getest maar ik laat het aan php4u over anders gaan er zoveel dingen door elkaar lopen. Als antwoord op je vraag, de stylesheet (vormgeving) benader je vanuit index.php en de <link href="..."> moet dus, gezien vanuit index.php, goed zijn opgegeven.

In alle gevallen ga ik er vanuit dat dit de URL's zijn van de bestanden vanwege de mod_rewrite
site.nl/.htaccess
site.nl/index.php

Deze mappen zijn er dus niet want in index.php verzorg je vormgeving en content (bijv. uit database)
site.nl/formule/
site.nl/formule/uitleg/
site.nl/formule/uitleg/aang.duur/
 
Laatst bewerkt:
Mijn script #24 heb ik werkend getest maar ik laat het aan php4u over anders gaan er zoveel dingen door elkaar lopen. Als antwoord op je vraag, de stylesheet (vormgeving) benader je vanuit index.php en de <link href="..."> moet dus, gezien vanuit index.php, goed zijn opgegeven.

In alle gevallen ga ik er vanuit dat dit de URL's zijn van de bestanden vanwege de mod_rewrite
site.nl/.htaccess
site.nl/index.php

Deze mappen zijn er dus niet want in index.php verzorg je vormgeving en content (bijv. uit database)
site.nl/formule/
site.nl/formule/uitleg/
site.nl/formule/uitleg/aang.duur/

De urls kloppen.

De mappen bestaan echter wel

site.nl/formule bestaat
site.nl/formule/uitleg.php bestaat
site.nl/formule/uitleg/aang.duur bestaat niet dit komt uit de database.
 
Laatst bewerkt:
Dat maakt niet uit of het uit een database komt.
De bedoeling in mijn opzet is dat ze niet fysiek bestaan en dat je aan de hand van de waarden in de URL de juiste data of pagina's oproept.

Je kan in de index.php dus iets van een switch($path) gebruiken om te bepalen wat de eerste pagina is die je op wilt roepen. Je maakt infeite dus een router, die de route in je site bepaald aan de hand van de URL.

Voeg dit eens toe onderaan je code:
Code:
<?php
echo "<pre>".print_r($path,true)."</pre>";
?>

Je zult dan je URL in stukken gehakt zien, als je dan bijvoorbeeld naar http://site.nl/formule/uitleg gaat.
Deze elementen van de array kan je gebruiken om de juiste pagina of data op te roepen. Je hebt dan geen $_GET meer nodig, en je kan alles afhandelen vanuit je index.php.
 
Laatst bewerkt:
site.nl/formule bestaat
site.nl/formule/uitleg bestaat
Omdat deze mappen bestaan ga je direct naar deze map toe door de regel RewriteCond %{REQUEST_FILENAME} !-d (niet weghalen!!)

In .htaccess zet je site.nl/formule/uitleg/aang.duur om in site.nl/index.php?page=formule/uitleg/aang.duur
In principe is alleen het bestand site.nl/index.php voldoende. De content (uit de database) in index.php verandert afhankelijk van de parameter index.php?page=....

Als je de 2 mappen formule en uitleg weghaalt werkt het.
 
Laatst bewerkt:
maar naast de mappen formule en bestand uitleg.php heb ik natuurlijk ook gewone index.php(in de root), contact.php enz.
in het bestand formule/uitleg.php worden de gekozen gegevens uit de database gehaalt, dat lukt niet meer als ik de map moet verwijderen toch?
 
Deze 2 regels moeten in .htaccess ....
Code:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
.... omdat je bijvoorbeeld naar:
een bestaande file "site.nl/images/2018/plaatje.jpg" moet kunnen gaan (de !-f regel in .htaccess)
een bestaande directory "site.nl/test/" moet kunnen gaan (de !-d regel in .htaccess)

Met andere woorden, er wordt eerst gekeken of een bestand of map bestaat.
Zo niet, dan wordt alles wat na site.nl staat doorgegeven als parameter page=BLABLA

Ik vermoed dat je huidige paginastructuur niet geschikt is voor vriendelijk url's. In site.nl/index.php moeten de verzoeken worden afgehandeld en niet in index bestanden in submappen.

Ik begrijp uit je laatste post dat je nu een hoop werk erbij hebt.

Een bepaalde reden dat je dit zelf wilt doen (hobby?) en niet een cms wilt gebruiken?
 
Laatst bewerkt:
Deze 2 regels moeten in .htaccess ....
Code:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
.... omdat je bijvoorbeeld naar:
een bestaande file "site.nl/images/2018/plaatje.jpg" moet kunnen gaan (de !-f regel in .htaccess)
een bestaande directory "site.nl/test/" moet kunnen gaan (de !-d regel in .htaccess)

Met andere woorden, er wordt eerst gekeken of een bestand of map bestaat.
Zo niet, dan wordt alles wat na site.nl staat doorgegeven als parameter page=BLABLA

Ik vermoed dat je huidige paginastructuur niet geschikt is voor vriendelijk url's. In site.nl/index.php moeten de verzoeken worden afgehandeld en niet in index bestanden in submappen.

Ik begrijp uit je laatste post dat je nu een hoop werk erbij hebt.

Een bepaalde reden dat je dit zelf wilt doen (hobby?) en niet een cms wilt gebruiken?

inderdaad een hobby daarom hoeft het niet perfect te zijn, ik vind beetje met php spelen wel leuk.

inmiddels de index.php uit de formule map in mijn hoofdmap index.php gezet en het werkt, hiermee kan ik weer verder spelen en knutselen. Dankjewel allemaal!
 
Laatst bewerkt:
Voor wat veiligheid kan je dit bovenaan in .htaccess zetten.
Code:
# IF the uri contains http: or https:
RewriteCond %{QUERY_STRING} http\: [OR]
RewriteCond %{QUERY_STRING} https\: [OR]
# OR IF the uri contains [ or ]
RewriteCond %{QUERY_STRING} \[ [OR]
RewriteCond %{QUERY_STRING} \] [OR]
# OR IF the uri contains <script>
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
# OR IF the script trying to set a php globals variable via url
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
# OR IF any script is trying to modify a _request variable via url
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) [OR]
# OR IF the uri contains union
RewriteCond %{QUERY_STRING} UNION [OR]
# OR IF the uri contains double slash
RewriteCond %{QUERY_STRING} // [OR]
# OR IF the request contains /proc/self/environ (lfi hack)
RewriteCond %{QUERY_STRING} proc\/self\/environ [OR]
# OR IF the uri contains asterisk
RewriteCond %{QUERY_STRING} \*
# THEN deny the request 403
RewriteRule ^.*$ - [F,L]
Dit zijn algemene security regels en dus geen specifieke regels voor jouw website.
Maar iets is beter dan niets.
 
Dankje.

Is het dan wel mogelijk om een .php bestand (zonder .php in de url zichtbaar) aan te roepen?
 
Als die fysiek bestaat, en je die met mod_rewrite van te voren herschrijft, kan dat.
 
De RewriteCond regels van #33 zullen je niet in de weg zitten omdat er geen restricties in staan voor mappen of bestanden. De regels kijken alleen naar het gedeelte wat achter de ? staat in de url.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan