mod_headers không gửi tiêu đề khi tệp là PHP


9

Tôi đã đặt tệp .htaccess của mình thành như sau:

 Header set MyHeader "I'm Set!"

Nếu tôi đi đến thư mục đó ( http://example.com/test/) không có tệp chỉ mục mặc định và xem hoạt động mạng (trong trường hợp này với Chrome), tôi có thể thấy rằng tiêu đề đang được gửi. Nếu tôi đi đến tệp php ( http://example.com/test/test.php), tiêu đề sẽ không được gửi.

Tôi đã tạo một index.html (chỉ đơn giản <pre>Hilà nội dung) và nó được gửi. Tôi thay đổi tên tập tin thành .php, không có tiêu đề. Nếu tôi thay đổi ký tự test.phpthành test.html, nó sẽ xuất ra mã trông giống rác và tiêu đề được gửi. Nếu tôi thay đổi test.phpthành test.png, tôi nhận được một biểu tượng hình ảnh bị hỏng và tiêu đề được gửi.

Vì vậy, không có kiểm tra ngoài các điều khoản về phần mở rộng tệp và loại mime, chỉ xuất hiện .phpcác tệp (hợp pháp hoặc theo cách khác) được đặt thành không áp dụng quy tắc .htaccess hoặc cụ thể là các chỉ thị mod_headers. Nhưng tôi không biết làm thế nào để kiểm tra điều này và vì đó là một máy chủ dùng chung, tôi không có httpd.confquyền truy cập để chọc ngoáy.

Bất kỳ ý tưởng nào về lý do tại sao apache sẽ bỏ qua việc gửi tiêu đề cho các tệp php?

Tôi cũng đã thử:

 <FilesMatch "\.(php)$">
     Header set MyHeader "I'm Set!"
 </FilesMatch>

Cập nhật từ PHP / CGI sang PHP / FastCGI dường như đã sửa nó. Tôi vẫn rất mong muốn nhận được phản hồi nếu có ai biết nguyên nhân sâu xa là gì.
Anthony

1
Anthony, bạn đã sử dụng mod_fastcgi? Tôi trải nghiệm chính xác hành vi tương tự và đối với tôi, mod_fastcgi phá vỡ chức năng của mod_headers. Tôi gửi báo cáo lỗi này ngày hôm qua: bugs.launchpad.net/ubuntu/+source/libapache-mod-fastcgi/+bug/...
Onkeltem

giống nhau ở đây: / bất kỳ tin tức hoặc cách giải quyết đó? Tôi không thể tưởng tượng đây không phải là vấn đề trong nhiều trường hợp ngoài kia ...
Adrian Föder

Câu trả lời:


4

Đây là hành vi dự kiến ​​khi chạy các kịch bản CGI. Từ phiên bản (2.4) mới nhất của tài liệu mod_headers :

Giá trị mặc định của onsuccess có thể cần phải được thay đổi thành luôn trong các trường hợp tương tự như các trường hợp được liệt kê dưới đây. Cũng lưu ý rằng việc lặp lại chỉ thị này với cả hai điều kiện có ý nghĩa trong một số trường hợp bởi vì luôn luôn không phải là một thay thế của các ứng dụng liên quan đến các tiêu đề hiện có:

[...]
Bạn đang sửa đổi hoặc xóa tiêu đề được tạo bởi tập lệnh CGI, trong trường hợp đó, tập lệnh CGI nằm trong bảng tương ứng với luôn và không có trong bảng mặc định.

Vấn đề ban đầu (với, có lẽ, một lời giải thích tốt hơn) là trong Bug 49308 .


Nếu tôi đọc chính xác, sử dụng Header always set MyHeader "I'm Set!"sẽ giải quyết được vấn đề. Tôi nghĩ rằng tôi đã tìm thấy một câu trả lời khi ai đó đề xuất điều đó và nó cũng không hoạt động cho OP trong trường hợp đó. Nhưng tôi cũng khá chắc chắn rằng họ đã nói thử Header set always, đó có thể là lý do khiến đề nghị đó thất bại.
Anthony

Không, tôi lấy lại. Tôi ctrl-z'd cho nỗ lực đó và nó đã được Header always set. Tôi chỉ đọc sai các trích dẫn?
Anthony

Trong câu hỏi ban đầu của bạn, bạn không có chỉ định đó; bạn có chắc chắn thiết lập của nó? Nó nên là một cái gì đó như Header always set MyHeader "I'm Set!", theo ví dụ của bạn.
Andrew M.

Chà, tôi đã thử nó, mặc dù không có sự chứng thực của Apache, vì vậy tôi có thể đã từ bỏ trong một lần thử. Và bây giờ nó đang hoạt động, tôi bế tắc khi cho rằng đó là sự chuyển đổi từ CGI sang FastCGI, nhưng tôi nghi ngờ tất cả xung quanh.
Anthony
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.