Kohana 3 mod_rewrite i błąd „No input file specified”

Stawiałem już projekty oparte na frameworku Kohana 3 na różnych serwerach. Jak dotąd zawsze działał mi plik .htaccess o treści:

# Turn on URL rewriting
RewriteEngine On
 
# Installation directory
RewriteBase /
 
# Protect application and system files from being viewed
RewriteRule ^(?:application|modules|system)\b - [F,L]
 
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
 
# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT]

(No ok mój plik htaccess jest bardziej robudowany, ale dla przejrzystości problemu podaję wersję minimalną – standardzik.)

Dzisiaj jednak szybkie i przyjemne przerzucenie projektu na serwer docelowy zostało brutalnie zburzone przez niemiły komunikat „No input file specified”, który pokazywał mi się przy próbie przejścia na dowolną podstronę.

Początkowo próbowałem użyć dyrektywy .htaccess-a

Options -MultiViews

Przy jakimś projekcie to mi kiedyś pomogło o ile dobrze kojarzę, ale tym razem nie.

Problematyczna okazała się linijka:

RewriteRule .* index.php/$0 [PT]

, którą na wszelkich forach, blogach itd. proponowano zastąpić na kilka różnych sposobów

RewriteRule .* index.php?$0 [PT,L,QSA]

albo

RewriteRule .* index.php [L]

jednemu podobno zadziałało coś takiego

RewriteRule .* index.php?kohana_uri=$0 [PT,L,QSA]

Mnie zadziałało dowolne z powyższych rozwiązań, ale tylko połowicznie. To znaczy – komunikat błędu zniknął, ale za to bez względu na wybraną podstronę zawsze pokazywała mi się strona główna. Nienawidzę takich zagadek.

Przeanalizowałem zawartość tablicy $_SERVER na moim serwerze testowym oraz produkcyjnym i wyszło mi, że na tym drugim brakuje PATH_INFO. Widać routing Kohany (przynajmniej w wersji 3.0) korzysta z tej wartości i bez niej zwyczajnie przestaje działać.

Ostatecznym remedium na mój kłopot okazało się prostackie obejście

$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];

Ja osobiście dodałem to w bootstrapie.

htaccess z www czy bez

Sporadycznie – tworząc nowy serwis, czy stronę internetową publikuję ją na serwerze. Dążąc do optymalizacji pod względem SEO staram się aby serwis dostępny był tylko pod jednym adresem. Dokładnie rzecz ujmując to pod wieloma, ale przy wejściu z alternatywnego adresu użytkownik powinien zostać przekierowany na adres główny, a przy okazji powinien zostać wysłany nagłówek 301 Moved Permanently. Najczęściej alternatywne adresy występują w postaci z przedrostkiem (subdomeną) www i bez. Dla przykładu adres example.com może też wystąpić w wersji www.example.com co wydaje się być jednym i tym samym a tym czasem to dwa zupełnie różne adresy.

Korzystając z dobrodziejstw serwera Apache i tzw. mod-rewrite-a możemy do tego celu użyć plików .htaccess. Ponieważ rzadko modyfikuję wyżej wspomniane pliki, najczęściej wpisując w nie znane i wypróbowane regułki, lubię kiedy są możliwie uniwersalne. W tym przypadku udało mi się znaleźć przykłady, które świetnie się sprawdzają i z uwagi na swą uniwersalność nie wymagają modyfikacji po przekopiowaniu na inny serwer gdzie podpięta jest inna domena.

Wymuszenie subdomeny www…

RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

i na odwrót.

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]