Testując niedawno wydaną wersję Windows Server 2008 R2 RC1 (ufff… chyba niczego nie zapomniałem ;) ) natknąłem się na problem z uruchamianiem aplikacji opartej o Zend Framework, która wykorzystuje przyjazną dla wyszukiwarek formę adresów url. Do skracana urli wykorzystuję Microsoft UrlRewriter’a, pobranego za pomocą Web Platform Installera. Jest to jeden z lepszych modułów i na prawdę jestem pod wrażeniem produktu wydanego spod znaczku MS. Samo PHP pracuje w trybie FastCGI, zainstalowane z paczki Zend Server CE.
Problem polegał na ciągłym ładowaniu się domyślnego kontrolera w domyślnej akcji (index/index), pomimo zmiany adresu na np. www.test.pl/modul/kontroler/akcja. Po rozpoznaniu problemu okazało, że odpowiedzialne jest błędne (może inaczej: odmienne) generowanie ścieżki w zmiennej serwerowej REQUEST_URI w serwerach IIS, przynajmniej w rzeczonej wersji. Błąd ten może prowadzić do np. tworzenia się nieskończonych przekierowań (jeżeli będziemy używali metody $this->_redirect(..).
Na szczęście w indeksie zmiennych pojawiają się nowe pozycje, kiedy Url Rewriter przepisuje adresy, dzięki czemu aplikacja wie, kiedy ścieżka jest bezpośrednia, a kiedy nie. Warto wspomnieć, że ZF współpracuje z innym, komercyjnym rewriterem dla serwera IIS. Cała poprawka w aplikacji ograniczyła się jedynie do wprowadzenia zmian w pliku index.php, który istnieje w folderze public (wiem… jestem leniwy). Cały sposób opiera się o podmianę zmiennej $_SERVER['REQUEST_URI'] na tą, którą zwrócił rewriter.
<?php
if (isset($_SERVER["IIS_WasUrlRewritten"])) {
$_SERVER['REQUEST_URI'] = $_SERVER["UNENCODED_URL"];
}
require '../application/bootstrap.php';
?>Problemem również są reguły UrlRewritera, jeżeli będziemy je importowali z pliku .htaccess. Aby działały będzie wymagane wpisanie do web.configa następujących parametrów:
<rewrite>
<rules>
<clear />
<rule name=?Zabezpieczenie? enabled=?true? patternSyntax=?Wildcard? stopProcessing=?true?>
<match url=?*? />
<conditions logicalGrouping=?MatchAny?>
<add input=?{REQUEST_FILENAME}? matchType=?IsFile? />
<add input=?{REQUEST_FILENAME}? matchType=?IsDirectory? />
</conditions>
</rule>
<rule name=?Main? stopProcessing=?true?>
<match url=?(.*)? />
<conditions logicalGrouping=?MatchAll? />
<action type=?Rewrite? url=?index.php? />
</rule>
</rules>
</rewrite>
Ostatnie komentarze