Nginx - Merutekan semua permintaan ke satu skrip

11

Saya memiliki skrip PHP yang menangani perutean skrip dan melakukan segala macam hal mewah. Awalnya dirancang untuk Apache, tetapi saya mencoba untuk memigrasikannya ke nginx untuk beberapa kotak saya. Saat ini, saya mencoba untuk memuluskan berbagai hal di server uji.

Jadi cara kerja skrip adalah bahwa ia memotong semua lalu lintas HTTP untuk direktori (di Apache) menggunakan .htaccessfile. Begini tampilannya:

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

Cukup mudah. Semua permintaan dijalankan index.php, sederhana dan sederhana.

Saya ingin meniru perilaku itu di nginx, tapi saya belum menemukan cara. Adakah yang punya saran?

Ini salinan nginx.conffile saya saat ini. Perhatikan bahwa itu dirancang bagi saya untuk hanya mencoba membuatnya bekerja; sebagian besar pekerjaan salin / tempel.

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

Jawaban:

13

Tambahkan ini,

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

Apa yang dilakukannya adalah pertama-tama memeriksa keberadaan $ uri dan $ uri / sebagai file / folder asli dan jika tidak ada hanya akan melalui /index.php (itu adalah pengaturan saya untuk kerangka kerja Zend di mana routing dilakukan melalui indeks .php) - tentu saja jika Anda perlu melewatkan beberapa parameter, cukup tambahkan ke /index.php a? q = di akhir dan itu akan melewati parameter.

Pastikan arahan try_file tersedia dari versi 0.7.27 dan seterusnya.

Adam Benayoun
sumber
Peringatan: Ini tidak akan berfungsi pada url yang diakhiri .php , misalnya ini akan berfungsi/doesNotExist.ph/doesNotExist.php
:,
7

Saya menemukan jawabannya sendiri! Ya!

Yang saya butuhkan untuk locationblok adalah:

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

Segala sesuatu yang lain sebagian besar tetap sama.

mattbasta
sumber
Apakah Anda mencoba apa yang saya tulis di bawah ini? Juga itu berarti bahwa semua file statis Anda akan melalui index.php - tidak yakin Anda menginginkannya.
Adam Benayoun
@ Adam: yeah, saya mencoba kode Anda. Saya ingin semuanya berjalan melalui index.php. Terimakasih Meskipun!
mattbasta
2

Untuk menyimpan argumen GET gunakan yang berikut:

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

$ is_args menjadi '?' jika $ args tidak kosong

Atau bahkan lebih sederhana:

location / {
    try_files /index.php$is_args$args;
}
Alexander Gavriliuk
sumber
Peringatan: Ini tidak akan berfungsi pada url yang diakhiri .php , misalnya ini akan berfungsi/doesNotExist.ph/doesNotExist.php
:,
1

Setelah mengatur dir root tambahkan ini

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

Menurut kebutuhan Anda, Anda dapat mengubah regex karena Anda perlu mengatur query_string menjadi index.php

Zhandos Zhandos Ulanuly
sumber
4
Ada cara yang lebih baik daripada ifmencapai apa yang dia minta. wiki.nginx.org/IfIsEvil
Isius
0

Satu perangkap yang sangat penting untuk berhati-hati ketika target Anda adalah file PHP adalah untuk memastikan apa pun return/ rewriteaturan yang Anda gunakan tidak menggantikan location ~ \.phparahan. Jika ini terjadi, nginx akan menyajikan file PHP Anda tanpa merendernya, mengungkapkan kode sumber PHP. Ini bisa menjadi bencana besar.

Cara teraman sudah disediakan, location / { try_files $uri $uri/ /index.php; }

Pastikan Anda juga mengatur index index.phpdi location /blok Anda dan batalkan komentar pada location ~ \.phpblok yang termasuk dalam file konfigurasi default.

Luke Mlsna
sumber