Clean URLs with lighttpd

To get clean URLs (e.g. for permalinks) in Lighttpd, you have to use the magnet module (lighttpd-mod-magnet in Ubuntu/Debian), and a Lua script.

I've created a file /etc/lighttpd/rewrite-to-docroot.lua:

if (not lighty.stat(lighty.env["physical.path"])) then
    lighty.env["physical.path"] = lighty.env["physical.doc-root"] .. "index.php"

And enabled it using:

magnet.attract-physical-path-to = ("/etc/lighttpd/rewrite-to-docroot.lua")

This simulates the following mod_rewrite snippet known from Apache:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Previously I was using a tricky method, which would use the 404 handler ("server.error-handler-404 = /index.php"), but this caused missing GET params (as documented in the Lighttpd FAQ).
As a result, paged browsing of categories and tags wasn't possible.


Comment from: Tblue [Visitor]
TblueThanks, but your lua script didn't work for me. This one worked:
if (not lighty.stat(lighty.env["physical.path"])) then
    -- prefix (subfolder) without the trailing slash, e. g. "/blogs"
    local prefix = ""
    lighty.env["uri.path"] = prefix .. "/index.php"
    lighty.env["physical.rel-path"] = lighty.env["uri.path"]
    lighty.env["physical.path"] = lighty.env["physical.doc-root"] .. lighty.env["physical.rel-path"]
2008-10-13 @ 15:52
Comment from: Daniel [Member] Email
Hmm.. Danke für die Erweiterung.

Allerdings habe ich ein weiteres Problem hiermit festgestellt: PATH_INFO wird nicht korrekt behandelt, weil es in diesem Stadium noch in physical.path mit drin steckt. Das führt dazu, dass der stat-Test fehlschlägt und an index.php verwiesen wird, obwohl es an z.B. getfile.php gehen sollte.

Keine Lösung in Sicht, ausser dass darix und stbuehler im IRC das so auch für falsch halten.
2008-10-16 @ 01:17
Comment from: Tblue [Visitor]
TblueHm, also ein Bug im lighty? Eigentlich sollte physical.path dann doch z. B. /var/www/blogs/htsrc/getfile.php enthalten und irgendeine andere Variable dann den Rest des Pfades (also beim Request für /htsrv/getfile.php/foo dann eben /foo). Oder verstehe ich das etwas falsch?
2008-10-16 @ 19:33
Comment from: Daniel [Member] Email
Ja, das hast Du richtig verstanden.
Die erste Reaktion war auch "physical.path sollte PATH_INFO nicht mehr enthalten".
Aber es stellte sich dann heraus, dass der "attract-physical-path-to"-Hook vor der PATH_INFO-Auflösung kommt.
2008-10-17 @ 18:43
Comment from: Tblue [Visitor]
TblueNa, wenn der Bug mal gefixt wird, muss ich mir wohl selbst ein Debian-Paket bauen. :-)
2008-10-20 @ 15:46
Comment from: waldemar [Visitor]
2008-11-28 @ 18:32

Leave a comment

Your email address will not be revealed on this site.
(Line breaks become <br />)
(Name, email & website)
(Allow users to contact you through a message form (your email will not be revealed.)
This is a captcha-picture. It is used to prevent mass-access by robots.
Please enter the characters from the image above. (case insensitive)
You can just use your OpenID to provide your name, e-mail and url.