Archief - .htaccess doorverwijzen pagina's

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

sarnath

Legacy Member
Volgend scriptje heb ik nu werkend draaien:

PHP:
RewriteRule ^index$ index.php
RewriteRule ^visie$ visie.php
RewriteRule ^prijzen$ prijzen.php
RewriteRule ^contact$ contact.php
RewriteRule ^prijzen/(.*)$ prijzen.php?type=$1

Ik maak dus voor elke pagina een regeltje dat doorverwijst naar de overeenkomstige php-pagina.
Nu leek het mij handiger dat in een regel te doen.

Hiervoor heb ik volgende regel gebruikt:
PHP:
RewriteRule ^(.*)$ /$1.php [L]

Die wil echter niet werken en ik krijg dan een internal server error met volgende error:
Code:
Sun Jan 17 14:56:24 2010] [error] [client ::1] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.

Voor html-paginas lukt het wel, dus als ik achter mijn link een .html zet, bijvoorbeeld http://www.mijnwebsite.com/contact.html verwijst hij naar contact.php
PHP:
RewriteRule ^(.*)?\.html$ $1.php [NC,L]

Ik heb er echter geen .html achter en wil dus dat hij als ik http://www.mijnwebsite.com/contact ingeef doorverwijst naar contact.php

cool_boy_ke

Legacy Member
Ken er niet zo veel van, maar probeer dit eens:
RewriteRule ^(.*)$.* /$1.php [L]

adrianhates

Legacy Member
het is volgens mij een oneindige lus van doorverwijzingen.. , ik kan dat alleen niet zeker zeggen.
Echter kan je het wel uit de fout afleiden:

"Use 'LimitInternalRecursion' to increase the limit if necessary. "

uit die limitInternatRecursion leid ik af dat je RewriteRule zichzelf blijft oproepen.

sarnath

Legacy Member
adrianhates zei:
het is volgens mij een oneindige lus van doorverwijzingen.. , ik kan dat alleen niet zeker zeggen.

Inderdaad, aan de errors die ik in de logs zie staan lijkt het zo.

Ik heb het zonet opgelost in ieder geval met volgend script:

PHP:
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ /$1.php

Nu, ik zou evenzeer graag willen weten waarom de .html extensie wel werkt en zonder totaal niet, iemand die een idee heeft mag het nog steeds laten weten.

Edit: ik krijg nu wel een internal server error als ik een pagina opgeef die niet bestaat in plaats dat er wordt gezegd "de pagina bestaat niet....".

GivenToFly

Legacy Member
Uw herschreven versie voldoet ook aan de rewriterule aangezien die gewoon zoekt naar eender welke reeks van tekens. Uw voorbeeld met html werkt wel omdat de herschreven pagina niet meer voldoet aan de rewriterule omdat die op .php eindigt ipv .html.

sarnath

Legacy Member
GivenToFly zei:
Uw herschreven versie voldoet ook aan de rewriterule aangezien die gewoon zoekt naar eender welke reeks van tekens. Uw voorbeeld met html werkt wel omdat de herschreven pagina niet meer voldoet aan de rewriterule omdat die op .php eindigt ipv .html.

ok, maar waarom zet de rule een pagina die op .html eindigt wel om in een .php pagina en een willekeurige tekenreeks niet naar een willekeurige tekenreeks + .php erachter?

Het heeft iets met die rewritecond te maken veronderstel ik?
Aangezien de regel in mijn laatste voorbeeld dezelfde is als in het eerste en die nu wel werkt met het toevoegen van de rewritecond.

De internal server is er in ieder geval wel nog bij het laatste voorbeeld, waarom zegt hij niet gewoon "pagina niet gevonden" ?

Parnakra

Legacy Member
In je nieuwe versie zal je RewriteRule pas uitgevoerd worden als alle voorafgaande RewriteConds voldaan zijn. In dit geval zegt de eerste conditie dat de naam géén bestand mag zijn en de tweede dat het géén map mag zijn.

M.a.w. je gaat naar ~/contact, er wordt gecontroleerd of er een map of file met de naam contact is. Die is er niet, dus wordt de rewriteRule uitgevoerd -> contact.php. Als de RewriteRule nu opnieuw opgeroepen wordt voor contact.php, is niet voldaan aan de eerste rewriteCond, dus wordt de rewriteRule niet uitgevoerd.

Waarom het in de oorspronkelijke versie met html wel werkt, is me niet meteen duidelijk.

GivenToFly

Legacy Member
sarnath zei:
ok, maar waarom zet de rule een pagina die op .html eindigt wel om in een .php pagina en een willekeurige tekenreeks niet naar een willekeurige tekenreeks + .php erachter?

Zonder html:
input string: "abcdef" => rewrite to "abcdef.php" => rewrite to "abcdef.php.php" => rewrite to "abcdef.php.php.php" => ... endless loop

Met html:
input string: "abcdef.html" => rewrite to "abcdef.php" en "abcdef.php" voldoet niet meer aan de regexp ^(.*)?.html$ dus pagina wordt geopend.

Curahee Q

Legacy Member
Ik doe het op mijn site als volgt

Code:
RewriteEngine on

RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteRule ^ index.php [L]

Als de file dus niet bestaat wordt hij herleid naar index.php, aan de hand van $_SERVER['REQUEST_URI'] bepaal ik dan wat ik ga doen.

sarnath

Legacy Member
Ok bedankt voor de zeer nutitge reacties, ben weer een heel pak beter geïnformeerd :).

Curahee Q zei:
Ik doe het op mijn site als volgt

Code:
RewriteEngine on

RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteRule ^ index.php [L]

Als de file dus niet bestaat wordt hij herleid naar index.php, aan de hand van $_SERVER['REQUEST_URI'] bepaal ik dan wat ik ga doen.

Hier heb ik wel nog een vraagje over:

ik heb nu het volgende script werkend:

PHP:
RewriteEngine On
RewriteBase /

RewriteRule ^([a-zA-Z0-9_-]+)$ /$1.php

RewriteRule ^prijzen/(.*)$ prijzen.php?type=$1

Als ik jouw regels toevoeg gaat hij altijd naar index.php gaan

dus


PHP:
RewriteEngine On
RewriteBase /

RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteRule ^ index.php [L]

RewriteRule ^([a-zA-Z0-9_-]+)$ /$1.php

RewriteRule ^prijzen/(.*)$ prijzen.php?type=$1

Klopt dit ? en hoe kan ik oplossen dat hij bijvoorbeeld naar een aparte pagina gaat met custom foutmelding indien die niet bestaat en anders gewoon altijd naar de juiste?
dus contact -> contact.php
contactblabla -> nopage.php

Curahee Q

Legacy Member
Natuurlijk gaat hij altijd naar index.php, als het bestand niet bestaat voert hij RewriteRule ^ index.php [L] uit. Ik kijk gewoon aan de hand van $_SERVER['REQUEST_URI'] waar ik zit en welke actie ik moet uitvoeren d.m.v. te splitten op /. Maar dat is mijn manier van werken natuurlijk.

sarnath

Legacy Member
yeps dat snap ik, maar ik bedoel dus dat ik mijn script zou willen aanpassen dat als een pagina niet bestaat dat hij naar een custom pagina met een zelfgeschreven foutmelding gaat.

PHP:
RewriteEngine On
RewriteBase /

RewriteRule ^([a-zA-Z0-9_-]+)$ /$1.php

Met bovenstaand script gaat hij dus de ingegeven tekens omzetten naar de tekens.php, maar stel dat die pagina niet bestaat, dan moet hij doorverwijzen naar nopage.php.

als ik dit erboven ga zetten:

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^ index.php [L]

gaat hij natuurlijk altijd naar index.php gaan omdat /contact niet bestaat, maar wel als contact.php

sarnath

Legacy Member
Ik heb nog een manier gevonden op het internet waar Curahee Q het over had.

Lijkt me ook nog handig, maar heb daar paar vragen over:

PHP:
<?php
// Kijk of het bestand zelf bestaat
if(        file_exists($_SERVER['DOCUMENT_ROOT'] . $_SERVER['REQUEST_URI'])
    AND ($_SERVER['SCRIPT_FILENAME'] != $_SERVER['DOCUMENT_ROOT'] . $_SERVER['REQUEST_URI'])
    AND ($_SERVER['REQUEST_URI']!="/")){

    $url = $_SERVER['REQUEST_URI'];
    include($_SERVER['DOCUMENT_ROOT'] . $url);

}

// Pak de parameters van de URL
$url         = strip_tags($_SERVER['REQUEST_URI']);
$url_array     = explode("/",$url);
array_shift($url_array); // De eerste is leeg

if ($url_array[0] == "home"){

    $include     = "pages/index.php";
   
}elseif ($url_array[0] == "nieuws"){

    if ($url_array[1]){
        // Er is een nieuwsbericht, ID opslaan
        $nieuwsID = $url_array[1];
    }

    $include     = "pages/nieuws.php";

}elseif ($url_array[0] == "404"){

    $include     = "pages/404.php";

}

// Als er geen pagina geselecteerd is, gaan we de 404 laten zien
if (!isset($include)){
    header('location:/404/');
}

include('include/header.php');
include($include);
include('include/footer.php');
?>

Bovenaan kijkt hij eerst of de fysieke file bestaat, is dat zo dan wordt deze geinclude.
Daarna gaat hij echter de url controleren op "home", "nieuws", etc.... , maar als bovenaan al is geconstateerd dat de file bestaat is $include toch nergens gezet en komt hij altijd hier terecht :

PHP:
if (!isset($include)){
    header('location:/404/');
}

Ik snap de manier van werken natuurlijk wel, maar het script lijkt mij gewoon niet optimaal.
Nuja ik zou in ieder geval mijn manier willen voortzetten en gewoon de error wegkrijgen.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan