Przyjazne linki Zend Framework w IIS7.5

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>

Dodaj komentarz

Twój adres email nie będzie opublikowany. Proszę, wpisz swoje imię, email oraz treść komentarza :)

*

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>