mod_rewrite ke aturan penulisan ulang nginx

Saya telah mengonversi sebagian besar aturan mod_rewrite Apache HTTPd saya ke modul HttpRewrite nginx (yang memanggil PHP-FPM melalui FastCGI pada setiap permintaan dinamis). Aturan sederhana yang ditentukan oleh lokasi sulit berfungsi dengan baik:

location = /favicon.ico { rewrite ^(.*)$ /_core/frontend.php?type=ico&file=include__favicon last; }

Saya masih mengalami masalah dengan ekspresi reguler, yang diuraikan dalam mod_rewrite seperti ini (perhatikan bahwa saya menerima garis miring dalam aturan, serta menambahkan string kueri ke setiap permintaan):

mod_rewrite

# File handler
RewriteRule ^([a-z0-9-_,+=]+)\.([a-z]+)$ _core/frontend.php?type=$2&file=$1 [QSA,L]

# Page handler
RewriteRule ^([a-z0-9-_,+=]+)$   _core/frontend.php?route=$1 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/$ _core/frontend.php?route=$1 [QSA,L]

RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)$   _core/frontend.php?route=$1/$2 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/$ _core/frontend.php?route=$1/$2 [QSA,L]

RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)$   _core/frontend.php?route=$1/$2/$3 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/$ _core/frontend.php?route=$1/$2/$3 [QSA,L]

Saya telah membuat konfigurasi server berikut untuk situs tersebut, tetapi saya menemukan aturan yang tidak cocok setelah menguraikan permintaan (misalnya; GET /user/auth):

mencoba menulis ulang nginx

location / {
    # File handler
    rewrite ^([a-z0-9-_,+=]+)\.([a-z]+)?(.*)$                                /_core/frontend.php?type=$2&file=$1&$3 break;

    # Page handler
    rewrite ^([a-z0-9-_,+=]+)(\/*)?(.*)$                                     /_core/frontend.php?route=$1&$2        break;
    rewrite ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)(\/*)?(.*)$                   /_core/frontend.php?route=$1/$2&$3     break;
    rewrite ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)(\/*)?(.*)$ /_core/frontend.php?route=$1/$2/$3&$4  break;
}

Apa saran Anda untuk menangani File Handler saya (yang hanya filename.ext), dan Page Handler saya (yang merupakan permintaan rute unik dengan hingga 3 properti yang ditentukan oleh garis miring)?

Karena saya belum mendapat tanggapan dari ini, saya juga tidak yakin apakah ini akan menimpa parser PHP saya yang didefinisikan dengan location ~ \.php {}, yang disertakan sebelum aturan penulisan ulang ini.

Poin bonus jika saya dapat menyelesaikan masalah penguraian tanpa perlu menggunakan aturan baru untuk setiap jumlah properti rute.


person abestic9    schedule 31.07.2012    source sumber


Jawaban (1)


Saya akhirnya menulis aturan berikut:

Penanganan File

location ~ ^/([a-zA-Z0-9-_]*)\.([a-zA-Z0-9]*)$ { include /web/_config/php.conf; rewrite ^/([a-zA-Z0-9-_]*)\.([a-zA-Z0-9]*)$ /_core/frontend.php?type=$2&file=$1 last; }

Pengendali file mengambil nama dan ekstensi dan menuliskannya ke dalam type={ext}&file={name}.

Pengendali Laman

location ~ ^/([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)$ /_core/frontend.php?route=$1 last; }
location ~ ^/([a-z0-9-_]*)/?([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)/?([a-z0-9-_]*)$ /_core/frontend.php?route=$1/$2 last; }
location ~ ^/([a-z0-9-_]*)/?([a-z0-9-_]*)/?([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)/?([a-z0-9-_]*)/?([a-z0-9-_]*)$ /_core/frontend.php?route=$1/$2/$3 last; }

Penangan halaman (yang dalam hal ini menangani hingga 3 "direktori") mengambil string di antara setiap pemisah (/), melakukan validasi regex dan menulisnya sebagai string kueri.

Perbedaan utama antara ini dan konfigurasi asli saya adalah bahwa setiap entri memiliki pengendali lokasinya sendiri, dengan aturan last ia memprosesnya pada pertandingan pertama, jadi kinerjanya akan sedikit lebih baik.

Saya juga menemukan bahwa nginx menambahkan string kueri secara default, sehingga regex tidak diperlukan, peningkatan kinerja lainnya.

Perhatikan bahwa /web/_config/php.conf hanyalah konfigurasi pass-through FastCGI, dan konfigurasi yang dikirimkan bersama nginx (biasanya /etc/nginx/fastcgi.conf) akan berfungsi dengan baik. Perhatikan bahwa jika Anda berurusan secara eksklusif dengan PHP, Anda tidak perlu mendefinisikan ini di setiap aturan, cukup tambahkan dengan include.

Semoga ini membantu.

person abestic9    schedule 13.11.2012