Làm cách nào để truyền tham số tùy chỉnh cho PHP từ Nginx?


10

Tôi đang sử dụng Nginx 1.2.4kết hợp với PHP-FPM 5.4.8với một fastcgiđường chuyền và cố gắng để vượt qua các thông số tùy chỉnh để PHP. Dưới đây là các tùy chọn tôi đã tìm thấy cho đến nay:

  • sử dụng envchỉ thị để đặt biến môi trường trong nginxvà tìm nạp nó với getenv()hoặc $_ENVtừ đó PHP. Vấn đề là envchỉ hoạt động trong mainngữ cảnh trong khi tôi cần đặt tham số trong serverngữ cảnh.

  • sử dụng fastcgi_paramchỉ thị như được thiết kế cho điều đó.

Tôi đã thử thay đổi giá trị của một số tham số bằng cách sử dụng fastcgi_paramnhưng không thành công:

nginx:

fastcgi_param PATH_INFO "/var/tmp";

PHP:

Tôi đã kiểm tra tất cả các mảng được xác định trước mà tôi có thể tìm thấy:

echo '<pre>';
echo "\n".'$GLOBALS'."\n"; var_dump($GLOBALS);
echo "\n".'$_SERVER'."\n"; var_dump($_SERVER);
echo "\n".'$_GET'."\n"; var_dump($_GET);
echo "\n".'$_POST'."\n"; var_dump($_POST);
echo "\n".'$_FILES'."\n"; var_dump($_FILES);
echo "\n".'$_REQUEST'."\n"; var_dump($_REQUEST);
echo "\n".'$_SESSION'."\n"; var_dump($_SESSION);
echo "\n".'$_ENV'."\n"; var_dump($_ENV);
echo "\n".'$_COOKIE'."\n"; var_dump($_COOKIE);
echo "\n".'$php_errormsg'."\n"; var_dump($php_errormsg);
echo "\n".'$HTTP_RAW_POST_DATA'."\n"; var_dump($HTTP_RAW_POST_DATA);
echo "\n".'$http_response_header'."\n"; var_dump($http_response_header);
echo "\n".'$argc'."\n"; var_dump($argc);
echo "\n".'$argv'."\n"; var_dump($argv);
echo '</pre>';

Người duy nhất thể hiện PATH_INFO$_SERVER:

var_dump($_SERVER); // ["PATH_INFO"]=> string(0) ""

Nhưng giá trị tôi đặt nginxkhông được tính đến.

Q1: Tôi có cần cấu hình bất cứ thứ gì ở nginx/phpcấp độ để lệnh fastcgi_paramcó hiệu lực không?

Câu 2: fastcgi_paramLệnh có giới hạn trong danh sách các tham số được xác định trước không (ví dụ: tôi có thể đặt PATH_INFOnhưng không phải là biến tùy chỉnh của riêng mình như FOO)?

Câu 3: Nếu có cho Q2: có cách nào để truyền tham số tùy chỉnh cho PHP từ Nginx không?

Câu trả lời:


14

Bạn có thể truyền các tham số bổ sung thông qua chỉ thị fastcgi_param. Tôi chắc chắn bởi vì tôi đã sử dụng chức năng này.

Cấu hình nginx mẫu mực của tôi

server {
    server_name localhost;
    include     conf/defaults.conf;
    root        /var/www;

    location    ~* "\.php$" {
        fastcgi_param CRS "crs";
        include conf/fastcgi-php.conf;
    }                                           
}

Và một phần của đầu ra phpinfo ():

...
_SERVER["USER"] fcgi
_SERVER["HOME"] /dev/null
_SERVER["FCGI_ROLE"]    RESPONDER
_SERVER["REMOTE_USER"]  no value
_SERVER["CRS"]  crs
_SERVER["QUERY_STRING"] no value

Tôi có fastcgi.conffastcgi_paramskhông fastcgi-php.conf: bạn lấy nó từ đâu? Bạn có nhớ chia sẻ nó qua pastebin?
Tối đa

Đó là cấu hình cụ thể của tôi nhưng không có phép thuật: fastcgi_pass 127.0.0.1:1028; fastcgi_index index.php; include conf/fastcgi.conf; và conf / fastcgi.conf chứa phần còn lại của các thông số và cài đặt bắt buộc của fastcgi
Krzysztof Księżyk

Điều duy nhất tôi có thể nghĩ là tôi đã quên bao gồm một cái gì đó trong conf khi biên dịch nginx. Mặt khác, tôi đã quên bao gồm những thứ khi biên dịch nginxtrong quá khứ, nhưng nginxsẽ từ chối nói rằng nó không biết về một số chỉ thị tôi đang sử dụng: ở đây không có gì, không có khiếu nại, nhưng nó fastcgi_paramkhông hoạt động: (Tôi sẽ dùng thử ubuntu nginxgói ban đầu và xem nó hoạt động như thế nào.
Tối đa

Có, nó hoạt động với ubuntu nginxgói mặc định ...
Tối đa

@ user64204 đây chắc chắn là một vấn đề với cấu hình của bạn và gói ubfox chỉ ghi đè lên một số tệp cấu hình của bạn. Nhưng vì bạn không hiển thị cho chúng tôi cấu hình đầy đủ của bạn, nên không có cách nào để xác định vấn đề thực sự là gì.
VBart

0

Bạn có thể sửa đổi yêu cầu bằng cách chuyển các biến tùy chỉnh của bạn trong tiêu đề yêu cầu, ví dụ:

proxy_set_header Variable-name-here Value-here;

Và sau đó bạn có thể đọc các giá trị đó từ tiêu đề yêu cầu trong tập lệnh PHP của bạn.

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.