Рейтинг:0

Блок местоположения NGINX передает в index.php все, кроме изображений.

флаг cn

У меня есть сервер API, который направляет весь трафик на скрипт index.php, использующий PHP. $_SERVER['REQUEST_URI'] переменная для интерпретации URL-адреса и предоставления правильного ответа.

Это отлично работает для всего, ЗА ИСКЛЮЧЕНИЕМ у меня есть сценарий, который временно обслуживает файлы с неаутентифицированной конечной точки для публичного использования. Таким образом, браузер правильно интерпретирует данные файла, расширение файла включается в конец URL-адреса.

Два примера:

Пример 1

https://myapi.com/file/read/0e3970ea32b2cce0285564aadb36c9d/m7hwCjCKDju88mKbW29EBhxoiuWTz9SF/Q2290814_BDKC3_031122_165240.xlsx

Этот запрос направляется $server_root/index.php, сценарий PHP извлекает данные файла из S3 и передает двоичные данные с правильными заголовками MIME-типа. Браузер инициирует загрузку и все отлично работает. (Это также отлично работает с файлами .doc и .pdf)

Пример 2

https://myapi.com/file/read/0e3970ea32b2cce0285564aeadb36c9d/m7hwCjCKDju88mKbW29EBhxoiuWTz9SF/Q2290814_BDKC3_031122_165240.jpg

Этот файл JPEG не будет отображаться правильно, вместо этого будет отображаться страница 404, сгенерированная NGINX. После некоторого тестирования я определил, что NGINX не передает запрос $server_root/index.php

Конфигурация NGINX

Основная конфигурация

сервер {
        слушать 80;

        имя_сервера myapi.com;
        
        set_real_ip_from 0.0.0.0/0;
        real_ip_header CF-Connecting-IP;

        индекс index.php index.html index.htm;

        журнал_доступа /var/log/nginx/myapi.com_access.log;
        журнал_ошибок /var/log/nginx/myapi.com_error.log;

        корень /var/www/vhosts/myapi.com/public;

        client_max_body_size 25м;

        включить /etc/nginx/conf/include_template.conf;

        add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; предварительная загрузка";
        add_header X-Content-Type-Options «нюхать» всегда;
        add_header X-Frame-Options «SAMEORIGIN» всегда;
        add_header X-XSS-защита "1; режим = блок";
        add_header Referrer-Policy «без реферера»;

        место расположения / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        расположение ~ .php$ {
                try_files $uri = 404;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;

                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
                fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;

                fastcgi_param HTTPS 'включен';

                fastcgi_buffer_size 128 КБ;
                fastcgi_buffers 256 16k;
                fastcgi_busy_buffers_size 256 КБ;
                fastcgi_temp_file_write_size 256 КБ;

                fastcgi_read_timeout 1800;
                fastcgi_connect_timeout 1800;
                fastcgi_send_timeout 1800;
                proxy_read_timeout 1800;
                proxy_connect_timeout 1800;
                proxy_send_timeout 1800;
                send_timeout 1800;

                включить fastcgi_params;
        }

}

/etc/nginx/conf/include_template.conf

    включить /etc/nginx/conf/gzip.conf;
    включить /etc/nginx/conf/restrictions.conf;
    включить /etc/nginx/conf/cors.conf;
    включить /etc/nginx/conf/browsercache.conf;

/etc/nginx/conf/gzip.conf

# Включить сжатие Gzip.
gzip включен;

# Отключить Gzip в IE6.
gzip_disable "msie6";

# Разрешить прокси кэшировать как сжатую, так и обычную версию файла.
# Предотвращает вывод тарабарщины клиентами, не поддерживающими Gzip.
gzip_vary включен;

# Сжимайте данные, даже когда клиент подключается через прокси.
gzip_proxy любой;

# Уровень сжатия, применяемый к файлам. Более высокий уровень сжатия увеличивает
# Использование процессора. Уровень 5 — это золотая середина, приводящая к сжатию примерно на 75%.
gzip_comp_level 5;

# Минимальная HTTP-версия запроса для выполнения сжатия.
gzip_http_версия 1.1;

# Не сжимайте файлы размером менее 256 байт, так как уменьшение размера будет незначительным.
gzip_min_length 256;

# Сжать следующие типы MIME.
gzip_types
    приложение/атом+xml
    приложение/javascript
    приложение/json
    приложение/ld+json
    приложение/манифест+json
    приложение/rss+xml
    приложение/vnd.geo+json
    приложение /vnd.ms-fontobject
    приложение/x-шрифт-ttf
    приложение/x-веб-приложение-манифест+json
    приложение/xhtml+xml
    приложение/xml
    шрифт/открытый тип
    изображение/bmp
    изображение/svg+xml
    изображение/x-значок
    текст/кэш-манифест
    текст/CSS
    текст/обычный
    текст/визитная карточка
    текст /vnd.rim.location.xloc
    текст/vtt
    текст/x-компонент
    text/x-междоменная политика;
# text/html всегда сжимается при включении.

/etc/nginx/conf/restrictions.conf

расположение /.git {запретить все; }
расположение /.htaccess {запретить все; }
расположение /.htpasswd {запретить все; }
местоположение /.user.ini {запретить все; }

расположение ~ ^/\. { отрицать все; }

местоположение ~ ~ $ { все отрицать; }

расположение ~* \.sql { запретить все; }
location ~* config\.json { запретить все; }

#if ($request_method !~ ^(GET|HEAD|POST)$ )
#if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|OPTIONS)$ )
#{
# вернуть 405;
#}

/etc/nginx/conf/cors.conf

        расположение ~* \.(?:svgz?|ttf|ttc|otf|eot|woff|woff2)$ {
            add_header Access-Control-Allow-Origin "*";
            истекает 8 дней;
        }

/etc/nginx/conf/browsercache.conf

местоположение ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg |midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
            истекает 7 дней;
        }

Вопрос

Как я могу изменить свою конфигурацию, чтобы каждый запрос направлялся в index.php, включая расширения файлов изображений?

Richard Smith avatar
флаг jp
Это полная конфигурация? Что находится в `/etc/nginx/conf/include_template.conf`? Он ведет себя так, как будто у вас есть «местоположение», которое соответствует URI, оканчивающемуся на «.jpg».
andrewniesen avatar
флаг cn
@RichardSmith - хороший вопрос. Я добавил дополнительную конфигурацию выше. Я прочитал его и не вижу ничего, что могло бы заставить его вести себя так, хотя я всегда борюсь с NGINX
Richard Smith avatar
флаг jp
Похоже, что `/etc/nginx/conf/browsercache.conf` соответствует этому URL, шаблон `jpe?g` соответствует `jpg`.
andrewniesen avatar
флаг cn
Что ж, это исправляет ситуацию, когда я закомментирую местоположение в `/etc/nginx/conf/browsercache.conf`, но почему кеширование может повлиять на это?
Richard Smith avatar
флаг jp
Это не имеет ничего общего с кешированием, но [как Nginx выбирает блок `location` для обработки запроса](http://nginx.org/en/docs/http/request_processing.html).

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.