Front Controller Patterns and nginx
It's no secret I'm a fan of nginx. Probably no secret that I'm a fan of front controller pattern design as well.
Why? I find it to be the most universal and easy to support. I create things from scratch using it, and the most popular software out there uses it - Drupal, Joomla, WordPress - and frameworks including the Zend Framework.
A lot of people cook up crazy nginx configurations for this stuff, when all it really takes for at least a standard setup is a single line of configuration code. However, I just found out something that was sitting in front of me this entire time.
BAD: I used to advise people to use this:
try_files $uri $uri/ /index.php?page=$uri$is_args$args;
BETTER: When actually, even simpler, you can use this:
try_files $uri $uri/ /index.php?page=$request_uri;
So my whole blog post here is slightly wrong. If you use $request_uri, you don't have to remember the $args. It's already there. 🙂
Note: different packages have different parameters. CMS Made Simple uses "page", Drupal uses "q", WordPress uses "q" - some software, like WordPress, doesn't technically need anything, they can fall back by reading PATH_INFO or REQUEST_URI, and not a parameter.
In which case, all you need is:
try_files $uri $uri/ /index.php;
Don't care about directories? Drop the "$uri/" too. Save some stat calls - if you don't need em 🙂