จะส่งพารามิเตอร์ที่กำหนดเองไปยัง PHP จาก Nginx ได้อย่างไร


10

ฉันใช้Nginx 1.2.4ร่วมกับPHP-FPM 5.4.8มีการส่งผ่านและพยายามที่จะส่งผ่านพารามิเตอร์ที่กำหนดเองเพื่อfastcgi PHPนี่คือตัวเลือกที่ฉันพบ:

  • โดยใช้envคำสั่งการตั้งค่าตัวแปรสภาพแวดล้อมในnginxและเรียกมันด้วยgetenv()หรือจาก$_ENV PHPปัญหาคือenvการทำงานในmainบริบทเท่านั้นในขณะที่ฉันต้องตั้งค่าพารามิเตอร์ในserverบริบท

  • ใช้fastcgi_paramคำสั่งตามที่ออกแบบมาสำหรับสิ่งนั้น

ฉันได้ลองเปลี่ยนค่าของพารามิเตอร์บางอย่างที่ใช้fastcgi_paramแต่ไม่ประสบความสำเร็จ:

Nginx:

fastcgi_param PATH_INFO "/var/tmp";

PHP:

ฉันตรวจสอบอาร์เรย์ที่กำหนดไว้ล่วงหน้าทั้งหมดที่ฉันสามารถหาได้:

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>';

สิ่งเดียวที่จะแสดงPATH_INFOคือ$_SERVER:

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

แต่ค่าที่ฉันตั้งไว้nginxไม่ได้นำมาพิจารณา

คำถามที่ 1: ฉันต้องกำหนดค่าใด ๆ ที่nginx/phpระดับเพื่อให้fastcgi_paramคำสั่งมีผล

Q2: fastcgi_paramคำสั่งถูก จำกัด ไว้ที่รายการพารามิเตอร์ที่กำหนดไว้ล่วงหน้า (เช่นฉันสามารถตั้งค่าPATH_INFOได้ แต่ไม่ใช่ตัวแปรที่กำหนดเองของตัวเองเช่นFOO)?

Q3: ถ้าใช่ถึง Q2: มีวิธีส่งพารามิเตอร์ที่กำหนดเองไปยัง PHP จาก Nginx หรือไม่?

คำตอบ:


14

คุณสามารถส่งพารามิเตอร์เพิ่มเติมผ่านทางคำสั่ง fastcgi_param ฉันแน่ใจเพราะฉันใช้ความสนุกสนานนี้

การกำหนดค่า nginx แบบอย่างของฉัน

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

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

และส่วนหนึ่งของ 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

ฉันมีfastcgi.confและfastcgi_paramsแต่ไม่fastcgi-php.conf: คุณไม่ได้รับที่มันมาจากไหน? คุณต้องการแบ่งปันผ่าน Pastebin หรือไม่?
สูงสุด

มันเป็นรูปแบบเฉพาะของฉัน แต่ไม่มีเวทย์มนตร์: fastcgi_pass 127.0.0.1:1028; fastcgi_index index.php; include conf/fastcgi.conf; และ conf / fastcgi.conf มีส่วนที่เหลือของ fastcgi และ params ที่ต้องการ
Krzysztof Księżyk

สิ่งเดียวที่ฉันจะคิดว่าฉันลืมที่จะรวมถึงบางสิ่งบางอย่างใน conf nginxเมื่อรวบรวม ในทางกลับกันฉันลืมที่จะรวมสิ่งต่าง ๆ เมื่อรวบรวมnginxในอดีต แต่nginxจะปฏิเสธที่จะเริ่มบอกว่าไม่รู้เกี่ยวกับคำสั่งบางอย่างที่ฉันใช้: นี่ไม่มีอะไรไม่มีการร้องเรียน แต่ยังfastcgi_paramไม่ได้ทำงาน: (ฉันจะลองกับubuntu nginxแพ็คเกจเดิมและดูว่ามันจะเป็นอย่างไร
Max

ใช่มันใช้งานได้กับubuntu nginxแพ็คเกจเริ่มต้น...
สูงสุด

@ user64204 นี่เป็นปัญหากับการกำหนดค่าของคุณอย่างแน่นอนและแพ็คเกจ ubuntu เพิ่งจะเขียนทับไฟล์ปรับแต่งของคุณ แต่เนื่องจากคุณไม่ได้แสดงให้เราเห็นถึงการกำหนดค่าทั้งหมดของคุณเราจึงไม่สามารถระบุได้ว่าปัญหาคืออะไร
VBart

0

คุณสามารถแก้ไขคำขอโดยส่งตัวแปรที่กำหนดเองของคุณในส่วนหัวคำขอตัวอย่าง:

proxy_set_header Variable-name-here Value-here;

จากนั้นคุณสามารถอ่านค่าเหล่านั้นจากส่วนหัวคำขอในสคริปต์ PHP ของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.