2013-06-10 30 views
23

Tóm tắt: mod_proxy của Apache 2.4 dường như không chuyển tiêu đề ủy quyền tới PHP-FPM. Có cách nào để sửa lỗi này không?Tiêu đề Apache 2.4 + PHP-FPM và ủy quyền

Phiên bản dài: Tôi đang chạy máy chủ với Apache 2.4 và PHP-FPM. Tôi đang sử dụng APC cho cả hai bộ nhớ đệm opcode và bộ nhớ đệm của người dùng. Theo đề xuất của Internet, tôi đang sử dụng Apache 2.4 của mod_proxy_fcgi để proxy yêu cầu để FPM, như thế này:

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/foo/bar/$1 

Các thiết lập hoạt động tốt, ngoại trừ một điều: apc.php kèm của APC, được sử dụng để giám sát các trạng thái của APC không cho phép tôi đăng nhập (yêu cầu xem các mục trong bộ nhớ cache của người dùng). Khi tôi nhấp vào "Mục nhập bộ nhớ cache của người dùng" để xem bộ nhớ cache của người dùng, nó yêu cầu tôi đăng nhập, nhấp vào nút đăng nhập hiển thị biểu mẫu đăng nhập HTTP thông thường, nhưng nhập thông tin đăng nhập và mật khẩu chính xác không thành công. Chức năng này hoạt động hoàn hảo khi chạy với mod_php thay vì mod_proxy + php-fpm.

Sau một số googling tôi thấy rằng những người khác đã có cùng một vấn đề và tìm ra rằng đó là vì Apache đã không vượt qua các tiêu đề HTTP ủy quyền cho quá trình FastCgi bên ngoài. Đáng tiếc là tôi chỉ tìm thấy một sửa chữa cho mod_fastcgi, trông như thế này:

FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization 

Có một thiết lập tương đương hoặc một số cách giải quyết đó cũng sẽ làm việc với mod_proxy_fcgi?

+0

Cảm ơn đoạn mã "-pass-header Authorization"! Giúp tôi ra w/fastcgi. – Sergio

Trả lời

57

Các mô-đun Apache khác nhau sẽ tách tiêu đề Authorization, thường là vì "lý do bảo mật". Tất cả chúng đều có các thiết lập tối nghĩa khác nhau mà bạn có thể chỉnh sửa để đánh lừa hành vi này, nhưng bạn sẽ cần phải xác định chính xác mô-đun nào là để đổ lỗi.

Bạn có thể làm việc xung quanh vấn đề này bằng cách thông qua các tiêu đề trực tiếp với PHP qua env:

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 

Xem thêm Zend Server Windows - Authorization header is not passed to PHP script

+1

Điều này đã làm các trick, cảm ơn! – CodeTwice

+4

Điều này có thể giúp người dùng PHP 5.5+ và Apache 2.4. Sau khi thêm SetEnvIf Authorization "(. *)" HTTP_AUTHORIZATION = $ 1 vào .htaccess, bạn phải sử dụng biến $ _SERVER ['REDIRECT_HTTP_AUTHORIZATION'] thay vì $ _SERVER ['HTTP_AUTHENTICATION']. – Rahi

+0

nơi u thêm này = ¿? –

0

Tôi không tìm thấy bất kỳ cài đặt tương tự nào với mod_proxy_fcgi NHƯNG nó chỉ hoạt động cho tôi theo mặc định. Nó yêu cầu ủy quyền người dùng (.htaccess như thường lệ) và php nhận được nó, và làm việc như với mod_php hoặc fastcgi và pass-header. Tôi không biết liệu tôi có hữu ích hay không ...

CHỈNH SỬA: nó chỉ hoạt động trên teszt.com/ khi sử dụng DirectoryIndex ... Nếu tôi chuyển tên tệp php (ngay cả khi index.php!) nó không hoạt động, đừng chuyển auth sang php. Đây là một trình chặn cho tôi, nhưng tôi không muốn hạ cấp xuống apache 2.2 (và mod_fastgi) vì vậy tôi chuyển sang nginx (trên máy này).

19

này đã cho tôi một thời gian dài để crack, vì nó không phải tài liệu dưới mod_proxy hoặc mod_proxy_fcgi.

Thêm chỉ thị sau đây để conf apache của bạn hoặc .htaccess:

CGIPassAuth on 

Xem here để biết chi tiết.

+1

Lưu ý rằng điều này chỉ hoạt động trên Apache 2.4.13 trở lên, tức là không có trên bất kỳ phiên bản nào của Ubuntu kể từ ngày 15.10. –

+0

Giải pháp này có ý nghĩa hơn vì nó là gần gũi hơn với các thiết lập proxy đó header auth tàn tật đi qua, ví dụ: SetHandler "proxy: fcgi: //127.0.0.1: 9000" CGIPassAuth trên – Julz

Các vấn đề liên quan