Điểm:0

phần mở rộng nginx 404 .php với fpm

lá cờ eg

Khi tôi truy cập một url không tồn tại có phần mở rộng .php, tôi nhận được trang lỗi ngnix 404, tuy nhiên, url không có phần mở rộng .php sẽ hoạt động như mong đợi khi sử dụng try_files. Trường hợp 404 được xử lý thông qua ứng dụng php.

Nó đã xảy ra kể từ khi tôi thêm mã này vào đề xuất

fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
    trả lại 404;
}

Lý do thêm điều này là để sửa lỗi trong nhật ký: FastCGI đã gửi trong thiết bị lỗi chuẩn: "Không xác định tập lệnh chính" trong khi đọc tiêu đề phản hồi từ thượng nguồn Lỗi này xảy ra khi tôi truy cập tệp không tồn tại.php. Tôi đã đọc rất nhiều bài đăng về vấn đề liên quan đến việc thiếu 'SCRIPT_FILENAME' nhưng đây không phải là trường hợp của tôi.

ví dụ.conf

người phục vụ {
  nghe 443 ssl;
  nghe [::]:443 ssl;

  server_name example.com;

  gốc /var/www/ví dụ/công khai/công khai;

  access_log /var/log/nginx/example.access.log main_ext;
  error_log /var/log/nginx/example.error.log cảnh báo;

  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  bao gồm /etc/nginx/include.d/ssl.conf;

  # ấu trùng
  viết lại ^/index.php/(.*) /$1 vĩnh viễn;
    
  vị trí = / {
    try_files /page-cache/pc__index__pc.html /index.php?$query_string;
  }

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

  vị trí ~ [^/]\.php(/|$) {
    bao gồm /etc/nginx/include.d/php.conf;
    fastcgi_pass unix:/var/run/php/php8.0-fpm-example.sock;
  }
}

php.conf

# Kiểm tra tập tin tồn tại
try_files $uri =404;

# https://www.nginx.com/nginx-wiki/build/dirhtml/start/topics/examples/phpfcgi/
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
    trả lại 404;
}

fastcgi_index index.php;

# Giảm thiểu lỗ hổng https://httpoxy.org/
fastcgi_param HTTP_PROXY "";

tắt fastcgi_intercept_errors;

# bao gồm cài đặt fastcgi_param
bao gồm fastcgi_params;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

URL ví dụ: https://example.com/foo - Hoạt động tốt hiển thị khá 404 bên trong ứng dụng php. https://example.com/foo.php - Hiển thị ngnix 404 mặc định.

vautee avatar
lá cờ kr
Bạn có thể thêm các ví dụ URL hoạt động/không hoạt động này vào câu hỏi của mình không?
lá cờ eg
Chắc chắn tôi đã thêm những thứ này.
Điểm:1
lá cờ gr

Nếu bạn muốn các URI đó được xử lý như bất kỳ URI không tồn tại nào khác, hãy thay đổi try_files $uri =404; đến try_files $uri /index.php?$query_string; trong bạn php.conf tập tin.


Nếu ứng dụng PHP của bạn thực sự sử dụng ĐƯỜNG_INFO Biến FastCGI (mà tôi nghi ngờ), bạn nên sử dụng

fastcgi_split_path_info ^(.+\.php)(/.+)$;

try_files $fastcgi_script_name /index.php?$query_string;

đặt $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

(xem cái này vé trac nginx).

lá cờ eg
Tôi cần xóa câu lệnh if để trả về 404 nhưng không thực sự cần thiết nữa. Nhưng điều đó có ý nghĩa bây giờ cổ vũ.
Ivan Shatsky avatar
lá cờ gr
Tôi định đề cập rằng `if {... }` không còn cần thiết nữa trong khi viết câu trả lời nhưng lại quên nó đi. Dù sao bạn đã tìm ra nó cho mình :)

Đă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.