Nginx的清洁URL,如何用try_files将文件夹重写为参数

我正在用PHP编写一个简单的CMS。 页面(降价文件)和图像是这样访问(分别):

example.org/?q=about.md example.org/?i=photo.jpg 

或者,我想使用干净的URL与Nginx,使相同的请求看起来像这样:

 example.org/about example.org/photo.jpg 

我宁愿使用try_filesifrewrite但经过几个小时的试验,我不能得到它的工作。

 location / { try_files $uri $uri/ /?q=$uri.md =404; } location ~ \.(gif|jpg|png)$ { try_files $uri /?i=$uri =404; } 

我不明白为什么上面的代码不起作用(url参数工作正常,但漂亮的404错误)。

使用$uri作为parameter passing文件夹名称是否有问题?
我需要逃离一些奇怪的人物(除了我的房东)吗?


为了彻底,我运行Nginx 1.6.2,使用标准的nginx.conf。 这是我的服务器块的其余部分:

 server_name example.org; root /srv/example/; index index.html index.htm index.php; (...) location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi.conf; } 

而fastcgi.conf也是标准的。

我能够通过简单地省略=404来让你的例子工作:

 location / { try_files $uri $uri/ /?q=$uri.md; } location ~ \.(gif|jpg|png)$ { try_files $uri /?i=$uri; } 

引用手册 :

以指定顺序检查文件的存在,并使用第一个找到的文件进行请求处理; […] 如果找不到任何文件,则将内部重定向到最后一个参数中指定的uri

你想要的内部重定向,这只发生,如果没有找到任何文件,但总是找到=404