Điểm:0

Khối vị trí NGINX chuyển mọi thứ sang index.php ngoại trừ hình ảnh

lá cờ cn

Tôi có một máy chủ API chuyển tất cả lưu lượng truy cập tới tập lệnh index.php sử dụng PHP $_SERVER['REQUEST_URI'] biến để diễn giải URL và cung cấp phản hồi chính xác.

Điều này hoạt động hoàn hảo cho mọi thứ, NGOẠI TRỪ tôi có một tập lệnh tạm thời phục vụ các tệp từ một điểm cuối không được xác thực cho mục đích sử dụng chung. Vì vậy, trình duyệt diễn giải chính xác dữ liệu tệp, phần mở rộng tệp được bao gồm ở cuối URL.

Hai ví dụ:

ví dụ 1

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

Yêu cầu này được chuyển đến $server_root/index.php, tập lệnh PHP lấy dữ liệu tệp từ S3 và truyền dữ liệu nhị phân với tiêu đề loại mime chính xác. Trình duyệt bắt đầu tải xuống và mọi thứ đều hoạt động tốt. (Điều này cũng hoạt động tốt với các tệp .doc và .pdf)

ví dụ 2

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

Tệp JPEG này sẽ không phân phối chính xác mà thay vào đó, một trang 404 do NGINX tạo được hiển thị. Sau một số thử nghiệm, tôi đã xác định rằng NGINX không chuyển yêu cầu tới $server_root/index.php

Cấu hình NGINX

Cấu hình chính

người phục vụ {
        nghe 80;

        server_name myapi.com;
        
        set_real_ip_từ 0.0.0.0/0;
        real_ip_header CF-Connecting-IP;

        chỉ mục index.php index.html index.htm;

        access_log /var/log/nginx/myapi.com_access.log;
        error_log /var/log/nginx/myapi.com_error.log;

        gốc /var/www/vhosts/myapi.com/public;

        client_max_body_size 25m;

        bao gồm /etc/nginx/conf/include_template.conf;

        add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload";
        add_header X-Content-Type-Options "nosniff" luôn;
        add_header X-Frame-Options luôn luôn "SAMEORIGIN";
        add_header X-XSS-Protection "1; mode=block";
        add_header Chính sách người giới thiệu "không có người giới thiệu";

        địa điểm / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        vị trí ~ .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 'bật';

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

                fastcgi_read_timeout 1800;
                fastcgi_connect_timeout 1800;
                fastcgi_send_timeout 1800;
                proxy_read_timeout 1800;
                proxy_connect_timeout 1800;
                proxy_send_timeout 1800;
                gửi_thời gian chờ 1800;

                bao gồm fastcgi_params;
        }

}

/etc/nginx/conf/include_template.conf

    bao gồm /etc/nginx/conf/gzip.conf;
    bao gồm /etc/nginx/conf/restrictions.conf;
    bao gồm /etc/nginx/conf/cors.conf;
    bao gồm /etc/nginx/conf/browsercache.conf;

/etc/nginx/conf/gzip.conf

# Kích hoạt tính năng nén Gzip.
bật gzip;

# Tắt Gzip trên IE6.
gzip_disable "msie6";

# Cho phép proxy lưu vào bộ đệm cả phiên bản nén và phiên bản thông thường của tệp.
# Tránh các ứng dụng khách không hỗ trợ xuất ra Gzip một cách vô nghĩa.
bật gzip_vary;

# Nén dữ liệu, ngay cả khi máy khách kết nối qua proxy.
gzip_proxied bất kỳ;

# Mức độ nén để áp dụng cho các tập tin. Mức nén cao hơn tăng
# sử dụng CPU. Mức 5 là một phương tiện hạnh phúc dẫn đến khả năng nén khoảng 75%.
gzip_comp_level 5;

# Phiên bản HTTP tối thiểu của yêu cầu thực hiện nén.
gzip_http_version 1.1;

# Không nén các tệp nhỏ hơn 256 byte vì việc giảm kích thước sẽ không đáng kể.
gzip_min_length 256;

# Nén các loại MIME sau.
gzip_types
    ứng dụng/nguyên tử+xml
    ứng dụng/javascript
    ứng dụng/json
    ứng dụng/ld+json
    ứng dụng/tệp kê khai + json
    ứng dụng/rss+xml
    ứng dụng/vnd.geo+json
    ứng dụng/vnd.ms-fontobject
    ứng dụng/x-phông chữ-ttf
    ứng dụng/x-web-app-manifest+json
    ứng dụng/xhtml+xml
    ứng dụng/xml
    phông chữ/kiểu mở
    hình ảnh/bmp
    hình ảnh/svg+xml
    hình ảnh/biểu tượng x
    văn bản/bộ đệm-tệp kê khai
    văn bản/css
    văn bản/đồng bằng
    văn bản/vcard
    text/vnd.rim.location.xloc
    văn bản/vtt
    văn bản/thành phần x
    văn bản/x-chính sách tên miền chéo;
# text/html luôn được nén khi được bật.

/etc/nginx/conf/restrictions.conf

vị trí /.git { từ chối tất cả; }
vị trí /.htaccess { từ chối tất cả; }
vị trí /.htpasswd { từ chối tất cả; }
vị trí /.user.ini { từ chối tất cả; }

vị trí ~ ^/\. { Phủ nhận tất cả; }

vị trí ~ ~$ { từ chối tất cả; }

vị trí ~* \.sql { từ chối tất cả; }
vị trí ~* config\.json { từ chối tất cả; }

#if ($request_method !~ ^(GET|HEAD|POST)$ )
#if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|OPTIONS)$ )
#{
# trả về 405;
#}

/etc/nginx/conf/cors.conf

        vị trí ~* \.(?:svgz?|ttf|ttc|otf|eot|woff|woff2)$ {
            add_header Access-Control-Allow-Origin "*";
            hết hạn 8d;
        }

/etc/nginx/conf/browsercache.conf

vị trí ~* \.(?: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)$ {
            hết hạn 7d;
        }

Câu hỏi

Làm cách nào tôi có thể sửa đổi cấu hình của mình để mọi yêu cầu được chuyển đến index.php, bao gồm cả phần mở rộng tệp hình ảnh?

Richard Smith avatar
lá cờ jp
Là cấu hình đầy đủ? Có gì trong `/etc/nginx/conf/include_template.conf`? Nó hoạt động giống như bạn có một `vị trí` phù hợp với các URI kết thúc bằng `.jpg`
andrewniesen avatar
lá cờ cn
@RichardSmith - câu hỏi hay. Tôi đã thêm cấu hình bổ sung ở trên. Tôi đã đọc qua nó và không thấy bất cứ điều gì khiến nó hoạt động như thế này - mặc dù tôi luôn vật lộn với NGINX
Richard Smith avatar
lá cờ jp
Có vẻ như `/etc/nginx/conf/browsercache.conf` khớp với URL đó, mẫu `jpe?g` khớp với `jpg`.
andrewniesen avatar
lá cờ cn
Điều đó đã khắc phục được sự cố, khi tôi nhận xét vị trí trong `/etc/nginx/conf/browsercache.conf`, nhưng tại sao bộ nhớ đệm lại ảnh hưởng đến điều này?
Richard Smith avatar
lá cờ jp
Nó không liên quan gì đến bộ nhớ đệm, nhưng [cách Nginx chọn khối `location` để xử lý yêu cầu](http://nginx.org/en/docs/http/request_processing.html).

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.