url rewriting check?
Is het mogelijk om via php te controleren of URL rewriting mogelijk is?
In mijn cms wil ik dit soort urls kunnen gebruiken:
www.mijnsite.nl/nieuwepagina
Echter, als URL rewriting niet mogelijk is dan zal je dezelfde pagina als volgt moeten aanroepen:
www.mijnsite.nl/index.php?route=nieuwepagina
Nu wil ik eigenlijk tijdens de installatie van mijn cms gaan controleren of URL rewriting is ingeschakeld. Ik dacht dan om via het cms een testpagina aan te roepen:
www.mijnsite.nl/testpagina
Maaaar... als URL rewriting niet werkt dan gaat dit natuurlijk niet werken want dan kan ie de pagina niet vinden en krijg je dus een 404 pagina. Is hier iets op te verzinnen?
Waarom ik dit wil weten... als URL rewriting niet in ingeschakeld dan wil ik dat het CMS automatisch alle links prefixt met "index.php?route=".
Iemand suggesties?
* Bump *
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
/**
* A method to help see if mod_rewrite is on. If mod_rewrite is on, the dispatch of
* index.php can be ignored, otherwise, that node in the request URI should be filtered
* out.
* @uses SetEnv HTTP_MOD_REWRITE On /* in .htaccess
* @return bool true if on, false otherwise
*/
function IsModRewriteOn ()
{
if(function_exists('apache_get_modules'))
{
$modules = apache_get_modules();
$rewrite = in_array('mod_rewrite', $modules);
}
else
{
// Hier zou je dus in een .htaccess moeten typen: SetEnv HTTP_MOD_REWRITE On
$rewrite = (getenv('HTTP_MOD_REWRITE') == 'On') ? true : false ;
}
return $rewrite;
}
?>
/**
* A method to help see if mod_rewrite is on. If mod_rewrite is on, the dispatch of
* index.php can be ignored, otherwise, that node in the request URI should be filtered
* out.
* @uses SetEnv HTTP_MOD_REWRITE On /* in .htaccess
* @return bool true if on, false otherwise
*/
function IsModRewriteOn ()
{
if(function_exists('apache_get_modules'))
{
$modules = apache_get_modules();
$rewrite = in_array('mod_rewrite', $modules);
}
else
{
// Hier zou je dus in een .htaccess moeten typen: SetEnv HTTP_MOD_REWRITE On
$rewrite = (getenv('HTTP_MOD_REWRITE') == 'On') ? true : false ;
}
return $rewrite;
}
?>
Gewijzigd op 02/02/2012 11:50:12 door Pieter Jansen
apache_get_modules terug geeft:
Maar als PHP als CGI module wordt gebruikt kan dit niet, je hebt dan geen toegang tot de phpinfo() functies. Je kan het via de shell functies doen. Maar je kan ook handmatig een .htaccess file aanmaken en bijv. file1.txt en file2.txt. In de .htaccess schrijf je RewriteRule file2\.txt file1.txt. Vervolgens kijk je of de waarde die file_get_contents( file2.txt ) gelijk is aan de waarde van file2 of aan de waarde van file1. Hiermee kan je afleiden of .htaccess werkt:
Je kan kijken of mod_rewrite in de array zit die Code (php)
Maar als PHP als CGI module wordt gebruikt kan dit niet, je hebt dan geen toegang tot de phpinfo() functies. Je kan het via de shell functies doen. Maar je kan ook handmatig een .htaccess file aanmaken en bijv. file1.txt en file2.txt. In de .htaccess schrijf je RewriteRule file2\.txt file1.txt. Vervolgens kijk je of de waarde die file_get_contents( file2.txt ) gelijk is aan de waarde van file2 of aan de waarde van file1. Hiermee kan je afleiden of .htaccess werkt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
function isModRewriteEnabled()
{
try
{
writeFile( 'file1.txt', 'file1' );
writeFile( 'file2.txt', 'file2' );
writeFile( '.htaccess', 'RewriteEngine On'.PHP_EOL.'RewriteRule file2\.txt file1.txt' );
if( file_get_contents('file2.txt') !== 'file1' )
return false
return true;
}
catch( LogicException $e )
{
echo '[ERROR] '.$e->getMessage();
}
catch( Exception $e )
{
echo $e->getMessage();
}
return false;
}
function writeFile( $file, $text )
{
$f = fopen($file, 'w');
if( $f !== false )
{
if( (fwrite($f, $text)) !== false )
{
fclose($f);
return true;
}
else
throw new LogicException('We cannot write to the file');
}
else
throw new LogicException(sprintf('The file(%s) cannot opened', $file));
return false;
}
function isModRewriteEnabled()
{
try
{
writeFile( 'file1.txt', 'file1' );
writeFile( 'file2.txt', 'file2' );
writeFile( '.htaccess', 'RewriteEngine On'.PHP_EOL.'RewriteRule file2\.txt file1.txt' );
if( file_get_contents('file2.txt') !== 'file1' )
return false
return true;
}
catch( LogicException $e )
{
echo '[ERROR] '.$e->getMessage();
}
catch( Exception $e )
{
echo $e->getMessage();
}
return false;
}
function writeFile( $file, $text )
{
$f = fopen($file, 'w');
if( $f !== false )
{
if( (fwrite($f, $text)) !== false )
{
fclose($f);
return true;
}
else
throw new LogicException('We cannot write to the file');
}
else
throw new LogicException(sprintf('The file(%s) cannot opened', $file));
return false;
}
Gewijzigd op 02/02/2012 11:57:35 door Wouter J
@Wouter: dankjewel. Maar... zou het kunnen zijn dat de module wel aanwezig is, maar niet ingeschakeld? Dus dat ie wel in de array voorkomt, maar disabled is? Of is ie altijd enabled als ie in de array zit?
Edit:
Antwoord op je hierboven gestelde vraag, ja. Als de modules in de lijst voorkomen, betekent het dat ze zijn ingeschakeld. Apache_get_modules() geeft alleen de geladen modules terug, niet alle modules die eventueel beschikbaar zouden zijn.
Antwoord op je hierboven gestelde vraag, ja. Als de modules in de lijst voorkomen, betekent het dat ze zijn ingeschakeld. Apache_get_modules() geeft alleen de geladen modules terug, niet alle modules die eventueel beschikbaar zouden zijn.
Gewijzigd op 02/02/2012 11:58:53 door Pieter Jansen
<IfModule mod_rewrite.c>
# Turn on the rewrite engine.
RewriteEngine On
</IfModule>
Ik schakel de rewrite engine dus altijd in... maar dan weet ik dus niet of de module wel of niet aan staat. Dat kan ik dan mooi controleren met apache_get_modules(). Volgens mij ga ik dat CGI niet gebruiken, dus dan volstaat deze code prima lijkt me:
Jep, dat klopt. Maar apache_get_modules() hoeft niet perse of elke PHP installatie te gebruiken zijn vandaar dat ik een toevoeging heb, getenv('HTTP_MOD_REWRITE') == 'On'. Puur persoonlijk waarschijnlijk.
Het lijkt alsof het vanaf versie 4.3.2 aanwezig is: http://nl2.php.net/apache_get_modules
...maar ik zie ook iets staan (links in het menu) over server specific extensions?
Is het dan wel of niet altijd aanwezig? Ik dacht eigenlijk dat getenv niet altijd aan te raden was?
Nee getenv is eigenlijk niet goed. Ik dacht dat het er standaard trouwens wel in zat, die apache_get_modules(). Ik heb die getenv alleen voor het geval dat.
Wat nou als mijn cms niet op een apache server staat? Maar op een Windows machine?
Werkt die functie dan nog?
Is dat soms de reden waarom je function_exists hebt gebruikt en die getenv?
Edit:
even gegoogled en ze gebruiken daar XML voor. Dus daar schiet je niet veel mee op denk ik.
even gegoogled en ze gebruiken daar XML voor. Dus daar schiet je niet veel mee op denk ik.
Gewijzigd op 02/02/2012 12:25:20 door Pieter Jansen
Maar stel nu dat je op een niet-Apache server draait. Bestaat die functie dan ook echt niet? Met andere woorden, moet je wel die function_exists gebruiken?
Functies bestaan in PHP in de vorm van grote libraries. De modules om de juiste term te gebruiken. De standaard PHP installatie die je kunt downloaden van php.net is bijvoorbeeld een kale versie. Daar zitten x aantal PEAR packages in en de core PHP. Maar voor meerdere dingen kun je ook extensions en modules toevoegen. Apache is daar een van.
Gewijzigd op 02/02/2012 12:33:45 door Pieter Jansen
Ah oké, dan gebruik ik gewoon die function_exists en getenv. Thanks!
Ik besef me net dat als je .htaccess om kan zetten naar xml en daar dus de environment variabelen uit kunt lezen, dat getenv dus wel werkt ook IIS. HTTP_MOD_REWRITE is dan namelijk ook op IIS dan een environment variabele. Dan zou dat je backup voor IIS kunnen zijn.
Maar als ik nou niks wil omzetten naar xml heeft die getenv dan wel of geen zin? Of werkt getenv wel op IIS?
getenv zit in PHP zelf. Alles wat je met phpinfo(); kunt opvragen kun je met getenv krijgen. Dus ook op IIS servers. Daarnaast gebruik ik het als een conditional statement, dus mocht het anders heten is het een kwestie van een nieuwe condition toevoegen mocht het op IIS anders heten.
Zou dat dan kunnen dat het op IIS anders heet? Is dat niet altijd hetzelfde?
Dat durf ik niet te zeggen, ik werk alleen met IIS als ik in C# zit en ik zit daar niet veel in op webservers. Dat zou je even moeten controleren bij IIS zelf. Of op een IIS community moeten vragen. Je mag wel verwachten dat andere environment variabelen als $_POST etc werken dus ik _gok_ dat het werkt. Maar goed, ik heb de jackpot niet gewonnen.. dus ja..
Ah oke... maar ik bedoel niet of die getenv werkt, maar of dat "HTTP_MOD_REWRITE" op Apache hetzelfde heet als op IIS. Of bedoel jij hetzelfde?