Lepší detekce aktivního .htaccess a mod_rewrite
- nejman
- Člen | 13
Ahoj,
řešil jsem problém s tím, že server neměl povolené parsování
.htaccess souboru a
pak při konfigurace routerů nefungovala, protože se nenačetli přepisovací
pravidla
z mod_rewrite.
I v případě, že jsem před inicializací routerů měl něco takového
<?php
if (function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules() )) {
$router[] = new Route('<presenter>/<action>/<id>'
...
}
else {
$router[] = new SimpleRouter('Homepage:default');
}
?>
kód nefungoval, přestože Apache měl naloadovaný mod_rewrite, ale nečetl pravidla z htaccess!
Jako dobrý workaround se mi jeví následující kód:
<?php
$apache_modules = (function_exists('apache_get_modules')) ? apache_get_modules() : array();
if (in_array('mod_rewrite', $apache_modules) && in_array('mod_env', $apache_modules) && isset($_SERVER['NETTE_HTACCESS'])) {
$router[] = new Route('<presenter>/<action>/<id>', array(
...
else
$router[] = new SimpleRouter('Homepage:default');
?>
a v /document_root upravený .htaccess:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]
<IfModule mod_env.c>
SetEnv NETTE_HTACCESS ok
</IfModule>
</IfModule>
Takto je zajištěno, že se v aplikaci dozvím zda-li Apache zpracoval
.htaccess a načetl
přepisovací pravidla.
Nevidíte tam někdo nějakou chybu? Mám pocit, že takto by to mělo bezvadně fungovat.
Zatím,
Honza
Editoval nejman (23. 3. 2010 16:21)
- nejman
- Člen | 13
Panda napsal(a):
Aha,
tak pro případ Fast-CGI by bylo možno celé testování ‚mod_rewrite‘ a
‚mod_env‘ vyhodit
a nechat tam jen test zda-li existuje v proměnných prostředí
$_SERVER['NETTE_HTACCESS']
.
Koneckonců fce pro stažení modulů Apache není nutná.
Honza