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
всегда нашли.