Назад | Перейти на главную страницу

Переопределение местоположения Nginx не делает то, что я хочу, мнения приветствуются

У меня есть файл конфигурации 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;
    }

Я не уверен, что регулярное выражение перезаписи оптимизировано, но у него есть замечательное свойство действительно выполнять свою работу.