У меня есть файл конфигурации Nginx, который работает для всего, кроме одной функции. Я установил Mediawiki, он работает неплохо, за исключением показа изображений (загрузка работает нормально).
Принимая во внимание (извините за кастрирование правильных ссылок, сайт говорит, что у меня недостаточно репутации, чтобы их написать)
www.domain.tld / wiki / Файл: Rosa_grande.jpg
приводит к ошибке 404,
www.domain.tld / wiki / index.php? title = Файл: Rosa_grande.jpg
работает нормально.
Итак, я начал копаться в конфигурации Nginx и заметил, что расположение «/» имеет приоритет над расположением изображений. Ошибка 404 возникает потому, что я еще не установил файл index.php в корень.
В частности, учитывая файл, расположенный в:
/wiki/images/7/78/Rosa_grande.jpg
Я вручную создал место, которое должно выдавать (только для целей отладки!) Ошибку 500:
location /wiki/images/.*\.(js|css|png|jpg|jpeg|gif|ico)$ {
more_set_headers 'Location 6';
return 500;
}
Регулярное выражение хорошо разбирается в http://www.regexplanet.com/advanced/java/index.html и действительно совпадает с "jpg".
Я также пробовал поместить ^ ~ / wiki / images / .... но безрезультатно.
Каждая попытка попасть в это место отменяется другим местом:
location / {
more_set_headers 'Location 10';
try_files $uri $uri/ /index.php?q=$uri&$args =404;
}
location ~ \.php$ {
more_set_headers 'Location 20';
try_files $uri =404; # This is not needed if you have cgi.fix_pathinfo = 0 in php.ini (you should!)
include include/php_fpm_pass.conf;
}
Я должен сохранить указанное / location, включая вызов index.php, потому что он управляет другими веб-приложениями. Как видите, я также добавил несколько полезных отладочных операторов more_set_headers, чтобы показать фактические обрабатываемые местоположения.
Печатать:
curl -I http://127.0.0.1:8080/wiki/images/7/78/Rosa_grande.jpg
должно отображаться сообщение об ошибке 500 (попадание в / wiki / images), а в заголовке должно отображаться «местоположение 6»
но вместо этого он показывает 404 и местоположение 10.
HTTP/1.1 404 Not Found
Server: nginx
Date: Wed, 31 Jul 2013 09:16:01 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: 10
Если я помещаю файл Rosa_grande.jpg на место, я получаю сообщение «200 OK» и все еще местоположение 10:
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 31 Jul 2013 09:09:02 GMT
Content-Type: image/jpeg
Content-Length: 19735
Last-Modified: Tue, 30 Jul 2013 09:50:15 GMT
Connection: keep-alive
ETag: "51f78c57-4d17"
Location: 10
Accept-Ranges: bytes
Ответ на первую часть моей проблемы оказался простым:
Я не должен был использовать:
location /wiki/images/.*\.(js|css|png|jpg|jpeg|gif|ico)$ {
но
location ~* /wiki/images/.*\.(png|jpg|jpeg|gif|ico)$ {
потому что только последний будет обрабатывать регулярное выражение до того, как "/" "поймает все".
Далее идет второй этап:
Преобразуйте "красивый URL" Mediawiki, например:
www.domain.tld/wiki/File:Rosa_grande.jpg
в
www.domain.tld/wiki/index.php?title=File:Rosa_grande.jpg
вызов.
На самом деле я не нашел никакого "очевидного" сопоставления с
File:Rosa_grande.jpg
URL-адрес фактического
wiki/images/7/78/Rosa_grande.jpg
поскольку я упускаю способ узнать, что File: Rosa_grande.jpg сопоставляется с файлом, хранящимся в субдиректории "/ 7/78 /".
Излишне говорить, что все другие модули Mediawiki безупречно работали с «красивыми URL-адресами», даже с теми, у которых есть URL-адреса «/ wiki / Action: Something», за исключением «/ wiki / File: Something».
Решение оказалось довольно простым: переписать на правильный, «уродливый» URL:
location ~* ^/wiki/File:(.*\.(png|jpg|jpeg|gif|ico))$ {
# more_set_headers 'Location 1.7: /wiki/File';
rewrite ^/wiki/File:(.*\.(png|jpg|jpeg|gif|ico))$ /wiki/index.php?title=File:$1 last;
}
Я не уверен, что регулярное выражение перезаписи оптимизировано, но у него есть замечательное свойство действительно выполнять свою работу.