url rewriting check?
Dat het in een xml bestand staat doet daar niet aan onder. Het zou onlogisch zijn dat $_ENV op IIS andere namen gebruikt dan Apache. Ook omdat de complete PHP documentatie van dezelfde naamgeving gebruik maakt.
Dus ik kan het niet verifieren maar ik _denk_ dat HTTP_MOD_REWRITE in xml op een soortgelijke manier geparsed zal worden als in een .htaccess.
Maar ik zal wel die function_exists gebruiken i.c.m. getenv();
Dan zit ik altijd goed denk ik??
SetEnv HTTP_MOD_REWRITE On
gaat zetten, zet je een environment variabele. Die kun je dus ophalen met getenv(). Wat ik met HTTP_ENV bedoel is dus soortgelijke variabelen.
Stel je hebt dit in je .htaccess:
<if mod_rewrite.c>
RewriteEngine on
</if>
Kun je dus ook een variabele instellen die te gebruiken is in PHP. Die kun je dus ophalen met getenv(); Dus voeg ik tussen de if diezelfde regel toe, dan weet ik via getenv dat die variabele geladen is.
<if mod_rewrite.c>
RewriteEngine on
SetEnv SOME_VAR On
</if>
SOME_VAR is nu een environment variabele. HTTP_MOD_REWRITE is een variabele naam, die kun je natuurlijk aanpassen.
Maar als je dus soortgelijke .htaccess code in je XML zou zetten bedoel ik dus dat je ze met getenv kunt benaderen. Dat bedoel ik met dat ze als gelijke soorten behandeld worden.
En nogmaals, dit is iets wat je normaliter niet zou doen, aangezien je in php dus de apache_get_modules() kunt gebruiken om environments te checken. Op IIS moet je alleen andere methodes gebruiken, als je dus een node in je XML toevoegt met soortgelijke informatie _gok_ ik dus dat je ze op die manier kunt afvangen.
Ik heb alleen een .htaccess bestand (dus geen xml) waar dit (en nog meer dingen) in staat:
Nu wil ik dus URL's rewriten en mijn vraag is hoe ik in PHP kan controleren of dit mogelijk is.
Dit kan ik dus doen met apache_get_modules. Dit werkt op een Apache server, maar niet op IIS. Mijn vraag is of die getenv('HTTP_MOD_REWRITE') == 'On') wel werkt, en dus toegevoegde waarde heeft, op een IIS server? Of werkt dit alleen met dat xml waar jij het over had?
apache_get_modules() is een redelijk stabiele methode om te kijken of url rewriting mogelijk is. Die getenv() vereist namelijk dat je wel een environment variabele gaat zetten in je .htaccess anders zal die gewoon false returnen, ook al zou die wel aan staan, je moet die regel code wel toevoegen in je .htaccess, dat is tevens ook een groot nadeel van environment variabelen.
Heeft het toevoegen van die regel nog nadelen of iets dergelijks?
<IfModule mod_rewrite.c>
# Turn on the rewrite engine.
RewriteEngine On
# De variabele
setEnv SOME_VARNAME On
</IfModule>
deze: setEnv SOME_VARNAME On
Het voordeel is dat je ook zonder apache_get_modules(); nu kunt kijken of mod_rewrite aan is, het nadeel is dat je een environment variabele gebruikt. Iets wat niet echt aangeraden wordt.
IIS heeft zijn eigen 'htaccess' genaamd web.config. Deze heeft een andere syntax en zorgt ook voor andere checks om te kijken of het werkt.
Verder heb je natuurlijk nog node.js met hun eigen node.js config file. En nog heel wat andere serves.
Om een totaal overzicht te krijgen van alle 'htaccess' files en servers + de syntax van deze files raad ik je aan eens te kijken in het HTML5boilplate Server Configs gedeelte.
PS: de rede dat apache_get_modules onder server specific staat is omdat het alleen op een apache server werkt, precies zoals al die andere apache_* functies.
Gewijzigd op 02/02/2012 14:49:35 door Wouter J
Ik heb overigens wel eens gewoon een .htaccess gebruikt op IIS hoor... dus het is wel mogelijk, maar waarschijnlijk is daar een of andere plugin voor nodig.
Even terugkomend op die setEnv... wat is daar dan het nadeel van... en, is het per se nodig? Ik denk dat het voor Apache geen meerwaarde heeft (correct me if I'm wrong!) omdat je daar die apache_get_modules al hebt. Bij IIS zou het wel meerwaarde kunnen hebben omdat apache_get_modules dan niet werkt, maar... als hier .htaccess (onder normale omstandigheden) ook niet werkt, heb ik dan wel iets aan die setEnv?
@Wouter, web.config is niets meer dan een xml bestand, er zijn als het goed is wel plugins om .htaccess te benaderen als een xml bestand, althans op Ozzie`s oordeel afgaande. Het idee is echter niet dat je .htaccess wil gebruiken op IIS maar meer om te kijken hoe je kunt kijken of mod_rewrite te gebruiken is. Op IIS heet het anders, daar kun je i.p.v. htaccess isapi gebruiken, wat overeen komt met htaccess. Afijn, het kwam er op neer of je environment vars kunt gebruiken op soortgelijke manieren als op PHP. Maar dat ligt puur aan de server configuratie. Naast node.js heb je natuurlijk heel veel varianten. Nginx bijvoorbeeld. Elk heeft een eigen variant
Zal ik dan gewoon alleen die apache_get_modules gebruiken en die setenv maar laten zitten?
Bovendien, je schrijft je CMS in PHP, je kunt echt niet voor alle verschillende configuraties redudantie opbouwen qua functionaliteit, dat moet je ook niet willen. Dat kost onzettend veel tijd, code en testen.
Kortom, jou keus. Als je getenv() wil gebruiken moet je dus ook een regeltje in je .htaccess toevoegen. Het is niet slecht, het staat alleen slordig omdat je een environment variabele gebruikt. Er kan alleen niet veel mis gaan.
Is mijn idee met het aanroepen van een testbestand (zoals ik beschreef in mijn openingspost) nog een optie? Of gaat dat nooit werken?
Ja dat is ook nog steeds een manier. Zoals Wouter ( geloof ik. ) ook aangaf. Dat kost alleen meer tijd en resources om te controleren. Maar ik gok dat je deze check alleen tijdens de installatie doet, dus dan kan dat wel.
Stel je hebt een installatiescript install.php. Dit script wil ik dan een pagina laten aanroepen met een SEO url, dus bijvoorbeeld: www.mijnsite.nl/test, die onderwater verwijst naar www.mijnsite.nl/test-of-rewriting-werkt.php
Als de rewriting goed gaat dan zou het bestand moeten worden aangeroepen. Als het niet goed gaat zou het moeten leiden tot een 404 pagina.
Maar de vraag is nu... hoe moet ik die www.mijnsite.nl/test aanroepen / inlezen? Want volgens mij kan ik een www bestand niet includen. Hoe moet ik dit dan doen?