Nginx чистые URL-адреса, как переписать папку в качестве аргумента с файлами try

Я пишу простую CMS на PHP. Страницы (файлы markdown) и изображения доступны следующим образом (соответственно):

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

необязательно, я хотел бы использовать чистые URL-адреса с Nginx, чтобы те же запросы выглядели так:

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

Я предпочитаю использовать try_files чем if и rewrite но после нескольких часов экспериментов я не могу заставить его работать.

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

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

Я не понимаю, почему приведенный выше код не работает (urls с аргументом работают нормально, но красивые дают 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 также является стандартным.

1 ответов


я смог заставить ваш пример работать, просто опустив =404:

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

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

цитирую руководство:

проверяет наличие файлов в указанном порядке и использует первый найденный файл для обработки запроса; [...] если ни один из файлов не был найден внутреннего редиректа на uri задается в последнем параметре.

вы хотите, чтобы внутреннее перенаправление, которое только происходит, если ни один из файлов не найден, но =404 всегда нашли.