August 2013 Archives

lighttpd, mod_rewrite для Yii

Оставлю это здесь, дабы не забыть. Надоело перекапывать google на эту тему. Есть несколько методов реализовать ЧПУ в контексте фреймворка Yii. Самый простой, поставить Apache и использовать его mod_rewrite с вот такими правилами:

AddDefaultCharset UTF-8
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
Но Apache прожорлив, монструозен и не всегда нужен. В своих поделках я использую lighttpd.
Включим mod_rewrite, раскоментировав строчку mod_rewrite. Должно получится так:
server.modules = (
        "mod_access",
        "mod_alias",
        "mod_compress",
        "mod_redirect",
        "mod_rewrite",
) 
В конфигурации виртуального хоста делаем так:
$HTTP["host"] =~ "example.com" {
  server.document-root = "/var/www"
  url.rewrite-if-not-file  = (
    ".*\?(.*)" => "index.php?$1",
    "." => "index.php"
  )
}
Или так (нужно установить и включить lighttpd-mod-magnet и lua):
$HTTP["host"] =~ "example.com" {
  server.document-root = "/var/www"
  magnet.attract-physical-path-to = ( "/etc/lighttpd/rewrite.lua" )
}
Собственно сам rewrite.lua:
function file_exists(path)
  local attr = lighty.stat(path)
  if (attr) then
      return true
  else
      return false
  end
end
if (lighty.env["request.uri"] == "/" or not file_exists(lighty.env["physical.path"])) then
        lighty.env["physical.rel-path"] = "/index.php"
        lighty.env["physical.path"] = lighty.env["physical.doc-root"] .. lighty.env["physical.rel-path"]
end
А если не охота конфигурировать каждый хост, то включаем simple-vhost и делаем примерно так:
$HTTP["host"] !~ "^(example\.com)$" {
  simple-vhost.server-root = "/var/www"
  simple-vhost.default-host = "example.com"
  simple-vhost.document-root = "public_html"
  url.rewrite-if-not-file  = (
    ".*\?(.*)" => "index.php?$1",
    "." => "index.php"
  )
}