nginx fastcgi“ ไม่รู้จักสคริปต์หลัก” เมื่อกำหนดค่า userdir


10

ฉันเกลียดการกำหนดค่า nginx มันซับซ้อนมาก ฉันจะทำให้ PHP ทำงานในผู้ใช้ของฉันได้อย่างไร? นี่คือส่วนที่เกี่ยวข้องของ nginx.conf ของฉัน:

    location ~ ^/~(.+?)(/.*)?$ {
        autoindex on;
        autoindex_exact_size off;
        alias /home/$1/public_html$2;

        location ~ \.php {
            include /etc/nginx/fastcgi.conf;
            fastcgi_intercept_errors on;
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
        }
    }

สิ่งนี้ทำให้ฉันมีข้อผิดพลาด: FastCGI sent in stderr: "Primary script unknown" while reading response header from upstreamในบันทึกข้อผิดพลาด nginx

นี่คือฉัน/etc/nginx/fastcgi.conf:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

ฉันสมมติว่า nginx แก้ปัญหาชื่อสคริปต์ไม่ถูกต้อง ฉันเกลียดที่จะบอก nginx ว่าจะดูในระบบไฟล์ของฉันได้ที่ไหนเขียน regexes ที่กำหนดเองสำหรับสิ่งที่ควรจะมีฟังก์ชั่นในตัว (หรืออย่างน้อยมาตรฐานและเอกสาร)


ที่เหลืออยู่ที่ไหน คือ/etc/nginx/fastcgi.confอะไร
Michael Hampton

@MichaelHampton ฉันเพิ่งเพิ่มข้อมูลนั้น
nnyby

คำตอบ:


9

ปัญหาคือใน fastcgi.conf ของคุณคุณกำหนดSCRIPT_FILENAMEเป็น$document_root$fastcgi_script_name;แต่จากนั้นคุณใช้ไดaliasเร็คทีฟเพื่อกำหนดเส้นทาง

คุณควรอัปเดตที่SCRIPT_FILENAMEจะใช้$request_filename

คุณสามารถกลับไปยังตำแหน่งที่ซ้อนกันได้หากต้องการ หากคุณยังคงได้รับข้อผิดพลาดนี้หลังจากนั้นฉันได้บันทึกความเป็นไปได้ทั้งหมดที่นี่: http://blog.martinfjordvald.com/2011/01/no-input-file-specified-with-php-and-nginx/

โปรดตรวจสอบว่าอาจมีสาเหตุอื่นหลายประการ


4

เมื่อคุณกำหนดการเปลี่ยนเส้นทาง, นามแฝงและคุณใช้ fastcgi ใน conf ของไซต์ของคุณใน nginx คุณสามารถลองใช้วิธีนี้เพื่อให้มันทำงานได้:

เปลี่ยนแปลง:

ตำแหน่ง ~ \ .php $ {
...
fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name;
...
}


เป็น:

ตำแหน่ง ~ \ .php $ {
...
fastcgi_param SCRIPT_FILENAME $ request_filename;
fastcgi_param REQUEST_URI $ uri $ args;
...
}

หากวิธีนี้ใช้ไม่ได้ให้ลองใช้ตามที่กล่าวข้างต้นโดยไม่มี REQUEST_URI ดังนั้นจะเป็นดังนี้:

ตำแหน่ง ~ \ .php $ {
...
fastcgi_param SCRIPT_FILENAME $ request_filename;
...
}


สิ่งนี้ใช้ได้กับฉันใน OSX Sierra
ajaybc

2

ลองใช้locationบล็อกแยกต่างหากสำหรับสคริปต์ PHP ใน userdirs สิ่งนี้ไม่จำเป็นต้องซ้อนกัน

location ~ ^/~([^/]+)/(.+\.php)$ {
    alias /home/$1/public_html/$2;
    include /etc/nginx/fastcgi.conf;
    fastcgi_intercept_errors on;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
}

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