Форум сайта python.su
Доброго времени суток всем!
В ходе просмотра курса от специалиста возник один вопросик по настройке FastCGI + Apache2, конкретней опишу ниже.
Есть приложение gallery.
urls.py в папке проекта (там где и settings.py) обрабывает url след. образом:
url(r'^images/', include('gallery.urls')),
url(r'.*\.jpe?g$', 'gallery.views.no_picture'),
def no_picture(request): return HttpResponseRedirect(u"/images/notFound.gif")
Отредактировано iJustTry (Фев. 23, 2015 16:06:53)
Офлайн
тут смысл в том, что обрабатываются урлы в порядке их определения.
т.е. сначала у вас проверится на совпадение с существующей картинкой, а если ничего не совпало, то в конце попадет под правило для:
url(r'.*\.jpe?g$', 'gallery.views.no_picture'),
Офлайн
Там прикол в том, что если по данному урлу находит картинку - он её выдает из директории. Просто выплёвывает как статичный файл в браузер. Там даже до обработки урла в Django дело не доходит, веб-сервер сам выдает картинку. А вот если он её не находит у себя по директории, то отдаёт урл на обработку в Django, а Django в свою очередь попросту редиректит на существующую картинку notFound.gif, которую веб-сервер находит и выплёвывает в браузер.
запрос на статику -> есть статика -> отдаём статику
запрос на статику -> не нашли статику -> отдаём запрос Django -> Django выдает редирект на статику -> выдаём статику.
-> запрос: 192.168.0.2/gallery/images/1.jpeg -> файл найден по директории: ../htdocs/images/1.jpeg -> возвращается клиенту в браузере
-> запрос: 192.168.0.2/gallery/images/blah-blah.jpeg -> файл в директории: ../htdocs/images/ не существует -> отдаём запрос на Django -> Django смотрит в урлы:
url(r'.*\.jpe?g$', 'gallery.views.no_picture'),
def no_picture(request): return HttpResponseRedirect(u"/images/notFound.gif")
location / { proxy_pass http://127.0.0.1:8080/; #Переадресация запросов к Apache proxy_set_header Host $http_host; #Подкорректируем заголовки, чтобы отличать одного клиента от другого proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_connect_timeout 120; proxy_send_timeout 120; proxy_read_timeout 180; } location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt|exe|pdf|djvu|doc|docx|xls|xlsx)$ { root /var/www/my_project; access_log /var/www/my_project/log/nginx_static.log; expires max;
url(r'.*\.jpe?g$', 'gallery.views.no_picture'),
Отредактировано iJustTry (Фев. 24, 2015 11:53:55)
Офлайн
ну это правильное поведение.
Если файл не найден в местах размещения статики, то запрос передается в джангу, где дальше проверяется по шаблонам урлов и наличию обработчика для 404.
т.е. таким образом не получится сделать урл, совпадающий с существующим элементом статики.
Офлайн
Так вот у меня он (nginx) не передаёт в джангу (а точне: не проксирует на апач, в случае когда не находит файла), а показывай свой 404 и всё(
Отредактировано iJustTry (Фев. 24, 2015 13:25:56)
Офлайн
попробуйте поиграться с этой настройкой:
http://wiki.nginx.org/HttpProxyModule#proxy_intercept_errors
Офлайн
Не канает((
Можно попросить линк на проверенный ман по которому можно настроить эту ересь (я про редирект и проксирование одного веб-сервера другим)? Я перепробовал кучу мануалов (половина из которых тупо уже не актуальна), а данный вид редиректа не даёт мне покоя.
Отредактировано iJustTry (Фев. 24, 2015 20:56:41)
Офлайн