Joomla op IIS

Door Gtoniser op zaterdag 27 oktober 2012 16:15 - Reacties (4)
Categorie: Algemeen, Views: 2.500

Joomla is net als Wordpress een vrij populair CMS.
Het probleem dat veel pakketten echter hebben, is dat ze ontworpen worden voor Apache op Linux. Dit is niet helemaal onterecht natuurlijk, omdat dit nu eenmaal het overgrote deel van de hostings betreft.
Voor wie echter met IIS werkt, geven deze pakketten vaak nogal problemen.

De "Search engine friendly" (SEF) module van Joomla bijvoorbeeld, wil niet zomaar werken met Microsoft's url_rewrite module. Zoals wel meer pakketten doen, gebruiken ze de PHP variable $_SERVER['REQUEST_URI']. Het probleem is echter, dat IIS deze variable niet kent, en dus het een en ander in de soep loopt.
Om dit toch te fixen, kun je (uiteraard alleen op IIS, apache heeft dat niet nodig), de volgende regels toevoegen bovenin de index.php van Joomla:

PHP:
1
2
3
4
5
6
if (isset($_SERVER['HTTP_X_REWRITE_URL']))
{
    $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];
}elseif(!isset($_SERVER['REQUEST_URI'])){
    $_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'];
}



Een ander probleem waar ik tegenaan liep, is dat Joomla niet helemaal snapt dat bestandsnamen op Windows niet hoofdlettergevoelig zijn. Dit gaf foutmeldingen dat het path niet in de open_basedir van PHP zou staan bij het uploaden van een extensie.
Folder::create: Path not in open_basedir paths; Unable to create destination
Het veranderen van de volgende code in /libraries/joomla/filesystem/folder.php gaf ook hier een oplossing voor:
(rond regel 236)

PHP:
1
2
3
4
5
6
7
8
9
10
// Iterate through open_basedir paths looking for a match
                foreach ($obdArray as $test)
                {
                    $test = JPath::clean($test);
                    if (strpos($path, $test) === 0)
                    {
                        $inBaseDir = true;
                        break;
                    }
                }

naar
PHP:
1
2
3
4
5
6
7
8
9
10
// Iterate through open_basedir paths looking for a match
                foreach ($obdArray as $test)
                {
                    $test = JPath::clean($test);
                    if (strpos(strtolower($path), strtolower($test)) === 0)
                    {
                        $inBaseDir = true;
                        break;
                    }
                }


Sowieso vind ik het nogal overkill om te kijken of een subdirectory van je website wel in je open_basedir path staat, ten eerste is dat een vrij logische aanname (hoe kun je anders de pagina bereiken) en ten tweede kan dit prima opgevangen worden bij het aanmaken van de map.

Hoewel dit waarschijnlijk niet het meest interessante blogitem is om te lezen, zijn er misschien mensen die dit ooit ook nodig hebben (en ik ben het zelf al meerdere keren tegengekomen, maar vergeet altijd hoe ik het ook al weer had opgelost).