Nginx - एकल स्क्रिप्ट के लिए सभी अनुरोधों को रूट करें


11

मेरे पास एक PHP स्क्रिप्ट है जो स्क्रिप्ट रूटिंग को संभालती है और सभी प्रकार की फैंसी चीजें करती है। यह मूल रूप से अपाचे के लिए डिज़ाइन किया गया था, लेकिन मैं इसे अपने कुछ बॉक्सों के लिए nginx में स्थानांतरित करने की कोशिश कर रहा हूं। अभी, मैं एक परीक्षण सर्वर पर चीजों को सुचारू करने की कोशिश कर रहा हूं।

तो जिस तरह से स्क्रिप्ट काम करती है, वह .htaccessफ़ाइल का उपयोग करके निर्देशिका (अपाचे में) के लिए सभी HTTP ट्रैफ़िक को स्वीकार करती है । यहाँ ऐसा है जो दिखता है:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.+$ index.php [L]
</IfModule>

बहुत सीधा। सभी अनुरोध index.phpसादे और सरल माध्यम से चलाए जाते हैं ।

मैं nginx पर उस व्यवहार की नकल करना चाह रहा हूं, लेकिन मुझे अभी तक कोई रास्ता नहीं मिला है। किसी के पास कोई सुझाव है?

यहाँ nginx.confइस समय मेरी फ़ाइल की एक प्रति है । ध्यान दें कि यह मेरे लिए डिज़ाइन किया गया था कि मैं इसे काम करने की कोशिश करूँ ज्यादातर कॉपी / पेस्ट नौकरी।

user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {
        include         /etc/nginx/mime.types;
        default_type    text/plain;
        include         /etc/nginx/conf.d/*.conf;
        server {
                listen          80;
                server_name     swingset.serverboy.net;

                access_log      /var/log/nginx/net.serverboy.swingset.access_log;
                error_log       /var/log/nginx/net.serverboy.swingset.error_log warn;

                root            /var/www/swingset;

                index           index.php index.html;
                fastcgi_index   index.php;

                location ~ \.php {
                        include /etc/nginx/fastcgi_params;
                        keepalive_timeout 0;
                        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                        fastcgi_pass    127.0.0.1:9000;
                }
        }
}

जवाबों:


13

इसे जोड़ो,

 location / {
                    try_files $uri $uri/ /index.php;
            }

यह क्या करता है यह पहले $ uri और $ uri / वास्तविक फ़ाइलों / फ़ोल्डरों के अस्तित्व की जांच करता है और यदि वे मौजूद नहीं होते हैं तो बस /index.php से गुजरेंगे (यह Zend फ्रेमवर्क के लिए मेरा सेटअप है जहां रूटिंग इंडेक्स के माध्यम से की जाती है .php) - बेशक अगर आपको कुछ मापदंडों को पारित करने की आवश्यकता है, तो बस अंत में /index.php a! q = में संलग्न करें और यह मापदंडों को पारित करेगा।

सुनिश्चित करें कि try_file निर्देश 0.7.27 और उसके बाद के संस्करण से उपलब्ध है।


चेतावनी: यह यूआरएल के अंत में काम नहीं करेगा .php , उदाहरण के लिए यह काम करेगा: /doesNotExist.ph लेकिन यह काम नहीं करेगा (इसके बजाय 404 मिलेगा):/doesNotExist.php
हेंशेंरिक

7

मैं इसे अपने दम पर पता लगा! हाँ!

locationब्लॉक के लिए मेरी आवश्यकता थी:

location /  {
    include /etc/nginx/fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME  $document_root/index.php;
    fastcgi_pass    127.0.0.1:9000;
}

बाकी सब कुछ काफी हद तक एक जैसा ही रहा।


क्या आपने कोशिश की कि मैंने नीचे क्या लिखा है? इसका यह भी मतलब है कि आपकी सभी स्टैटिक फाइलें index.php से गुजरेंगी - सुनिश्चित नहीं हैं कि आप ऐसा चाहते हैं।
एडम बेनाउन

@ एडम: हाँ, मैंने आपके कोड की कोशिश की। मैं सब कुछ index.php के माध्यम से चलाना चाहता था। हालांकि धन्यवाद!
मटकाबस्टा

2

GET तर्कों को संरक्षित करने के लिए निम्नलिखित का उपयोग करें:

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

$ is_args हो जाता है '?' अगर $ खाली नहीं है

या और भी सरल:

location / {
    try_files /index.php$is_args$args;
}

चेतावनी: यह यूआरएल के अंत में काम नहीं करेगा .php , उदाहरण के लिए यह काम करेगा: /doesNotExist.ph लेकिन यह काम नहीं करेगा (इसके बजाय 404 मिलेगा):/doesNotExist.php
हेंशेंरिक

1

रूट dir सेट करने के बाद इसे जोड़ें

if (!-e $request_filename)
{
    rewrite ^/(.*)$ /index.php?/$1 last;
    break;
}

अपनी आवश्यकता के अनुसार आप regex को बदल सकते हैं क्योंकि आपको index.php को query_string सत्तारूढ़ करने की आवश्यकता होती है


4
ifजो वह पूछ रहा है उसे पूरा करने से बेहतर तरीके हैं । wiki.nginx.org/IfIsEvil
Isius

0

जब आपका लक्ष्य एक PHP फ़ाइल है, तो सावधान रहने के लिए एक बहुत महत्वपूर्ण नुकसान यह सुनिश्चित करना है कि आप जो भी return/ rewriteनियम का उपयोग करते हैं वह location ~ \.phpनिर्देश को सुपरसीड नहीं करता है । यदि ऐसा होता है, तो nginx आपकी PHP फ़ाइल को इसे प्रस्तुत किए बिना, PHP स्रोत कोड का खुलासा करते हुए काम करेगा। यह भयावह हो सकता है।

सबसे सुरक्षित तरीका पहले से ही प्रदान किया गया है, location / { try_files $uri $uri/ /index.php; }

सुनिश्चित करें कि आप index index.phpअपने location /ब्लॉक में भी सेट करते हैं और location ~ \.phpडिफ़ॉल्ट कॉन्फिगर फाइल में शामिल ब्लॉक को अनकम्प्लीट करते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.