Nginx clean urls,如何用 try_files 重写文件夹作为参数

Nginx clean urls, how to rewrite a folder as an argument with try_files

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

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

可选地,我想在 Nginx 中使用干净的 URL,使相同的请求看起来像这样:

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

我宁愿使用 try_files 也不愿使用 ifrewrite,但是在试验了几个小时之后,我无法让它工作。

location / {
    try_files $uri $uri/ /?q=$uri.md =404;
}

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

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

使用 $uri 将文件夹名称作为参数传递有问题吗?
我是否需要转义一些奇怪的字符(除了我的房东)?


为了彻底,我是 运行 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;
}

引用 the manual:

Checks the existence of files in the specified order and uses the first found file for request processing; [...] If none of the files were found, an internal redirect to the uri specified in the last parameter is made.

您需要内部重定向,只有在找到 none 个文件时才会发生这种情况,但总能找到 =404