Nginx - Tüm istekleri tek bir komut dosyasına yönlendirir


11

Komut dosyası yönlendirme ve süslü şeyler her türlü yapar bir PHP komut dosyası var. Başlangıçta Apache için tasarlanmıştı, ancak birkaç kutum için nginx'e geçirmeye çalışıyorum. Şu anda, bir test sunucusundaki işleri düzeltmeye çalışıyorum.

Bu yüzden komut dosyasının çalışma biçimi, bir .htaccessdosya kullanarak dizin (Apache'de) için tüm HTTP trafiğini durdurmasıdır . İşte böyle görünüyor:

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

Oldukça basit. Tüm istekler index.phpbasit ve basit bir şekilde gerçekleştirilir.

Nginx'teki bu davranışı taklit etmek istiyorum, ama henüz bir yol bulamadım. Kimsenin önerisi var mı?

İşte nginx.confşu anda dosyamın bir kopyası . Unutmayın ki, sadece onu çalıştırmayı denemek benim için tasarlandı; çoğunlukla bir kopyalama / yapıştırma işi.

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

Yanıtlar:


13

Bunu ekle,

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

Yaptığı şey, önce $ uri ve $ uri / varlığını gerçek dosya / klasör olarak kontrol etmek ve eğer yoksa, /index.php'den geçecek (yönlendirmenin dizin yoluyla yapıldığı Zend çerçevesi için kurulumum bu .php) - elbette bazı parametreleri geçirmeniz gerekiyorsa, sonunda /index.php a? q = öğesine ekleyin ve parametreleri geçirecektir.

Try_file yönergesinin 0.7.27 ve sonrası sürümlerde mevcut olduğundan emin olun.


Uyarı: Bu, biten URL'ler üzerinde çalışmayacak, .php örneğin bu işe yarayacak: /doesNotExist.ph ancak bu işe yaramayacak (bunun yerine 404 alacak):/doesNotExist.php
hanshenrik

7

Kendi başıma anladım! Evet!

locationBlok için ihtiyacım olan tek şey:

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

Diğer her şey büyük ölçüde aynı kaldı.


Aşağıda yazdıklarımı denedin mi? Ayrıca, tüm statik dosyalarınızın index.php'den geçeceği anlamına gelir - bunu istediğinizden emin değilsiniz.
Adam Benayoun

@Adam: evet, kodunu denedim. Her şeyin index.php'den geçmesini istedim. Yine de teşekkürler!
mattbasta

2

GET argümanlarını korumak için aşağıdakileri kullanın:

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

$ is_args '?' olur $ args in boş değilse

Veya daha da basit:

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

Uyarı: Bu, biten URL'ler üzerinde çalışmayacak, .php örneğin bu işe yarayacak: /doesNotExist.ph ancak bu işe yaramayacak (bunun yerine 404 alacak):/doesNotExist.php
hanshenrik

1

Kök dizinini ayarladıktan sonra bunu ekleyin

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

İhtiyacınıza göre, query_string dizinini index.php olarak yönetmeniz gerektiği için normal ifadeyi değiştirebilirsiniz.


4
ifNe istediğini başarmanın daha iyi yolları var. wiki.nginx.org/IfIsEvil
Isius

0

Hedefiniz bir PHP dosyası olduğunda dikkatli olunması gereken çok önemli bir tuzak, kullandığınız return/ rewritekuralın location ~ \.phpdirektifin yerini almadığından emin olmaktır . Bu durumda, nginx PHP dosyanızı oluşturmadan sunarak PHP kaynak kodunu gösterir. Bu felaket olabilir.

En güvenli yol zaten sağlanmış, location / { try_files $uri $uri/ /index.php; }

Emin olun ayrıca set index index.phpsizin de location /blok ve yorumsuz location ~ \.phpvarsayılan yapılandırma dosyasında yer bloğu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.