У меня есть сервер 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, включая расширения файлов изображений?