Nette di belakang alias proksi terbalik pada nginx
P粉953231781
P粉953231781 2023-09-04 00:28:05
0
1
536
<p>Saya mempunyai aplikasi Nette yang dijalankan pada pelayan Apache2/Debian 11 dan ia berfungsi dengan baik. Walau bagaimanapun, kita perlu menggunakan alias untuk menyembunyikannya di sebalik proksi nginx. </p> <p>Andaikan kami mempunyai persekitaran Apache2 yang sempurna berjalan pada http://127.0.0.1:89/, dan kami mahu mengaksesnya melalui nginx yang ditetapkan sebagai proksi terbalik di https://example.com /applications/< ;/p> <p>tetapan nginx adalah seperti berikut:</p> <pre class="brush:php;toolbar:false;">lokasi /app/ { proxy_pass http://127.0.0.1:89; proxy_set_header Hos $host; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Proto "https"; proxy_set_header X-Forwarded-Port "443"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }</pre> <p>Walaupun konfigurasi Apache2 kekal tidak berubah sebelum percubaan proksi: </p> <pre class="brush:php;toolbar:false;"><VirtualHost *:89> ServerAdmin webmaster@localhost DocumentRoot /var/www/app/www/ <Direktori /var/www/app/www/> Indeks Pilihan FollowSymLinks AllowOverride Semua Memerlukan semua diberikan </Direktori> </VirtualHost></pra> <p>Masalahnya ialah aplikasi Nette masih menganggap ia berjalan pada laluan tanpa bahagian URI "/app", jadi semua pautan yang dijana melalui ubah hala dan panggilan pautan (termasuk pembolehubah templat $basePath) adalah tidak sah. < /p> <p>Saya turut menambahkan maklumat proksi pada konfigurasi Nette, dan memandangkan tika nginx dijalankan pada pelayan yang sama, ia kelihatan seperti ini: </p> <pre class="brush:php;toolbar:false;">http: proksi: 127.0.0.1</pre> <p>Saya cuba menetapkan konfigurasi nginx untuk memajukan laluan /admin dalam URI yang dimajukan: </p> <pre class="brush:php;toolbar:false;">proxy_pass http://127.0.0.1:89/admin;</pre> <p>Dan juga cuba bermain-main dengan penghala Nette untuk menapis bahagian "admin/" (tidak mencari AdminPresenter, yang jelas tiada): </p> <pre class="brush:php;toolbar:false;">$router->addRoute('[admin/]<presenter>/<action>[/<id>]', 'Homepage: lalai');</pre> <p>Aplikasi Nette menjana ralat ini apabila cuba mengakses halaman: </p> <pre class="brush:php;toolbar:false;">TypeError: unpack() menjangkakan parameter 2 ialah rentetan, bool diberikan dalam /var/www/app/vendor/nette/http/src/Http/Helpers .php:49 @ http://example.com/app/</pre> <p>Bolehkah seseorang menunjukkan saya ke arah yang betul? </p>
P粉953231781
P粉953231781

membalas semua(1)
P粉035600555

Baiklah, jawab soalan saya sendiri sekiranya ada yang mengalami masalah yang sama. Saya rasa penyelesaian saya agak godam, jadi sila hantar jawapan bukan godam.

Mula-mula, saya mengubah suai konfigurasi nginx:

location /app/ {
    rewrite /app/(.*) /app/ break;
    proxy_pass http://127.0.0.1:89/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Proto "https";
    proxy_set_header X-Forwarded-Port "443";
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Kemudian saya mengubah suai konfigurasi Nette untuk merangkumi semua proksi (mungkin sebenarnya tidak diperlukan):

http:
    proxy: 0.0.0.0/0

Saya turut menambah laluan "apl" dalam kod penghala (bukan sebagai awalan pilihan, tetapi sebagai laluan biasa):

$router = new RouteList;
$router->addRoute('app/<presenter>/<action>[/<id>]', 'Homepage:default');
$router->addRoute('<presenter>/<action>[/<id>]', 'Homepage:default');
return $router;

Juga mengubah suai kaedah permulaan kod BasePresenter:

$this->template->basePath = '/app'.$this->template->basePath;

Akhir sekali, saya mengubah suai fail .htaccess untuk menulis semula URL semua sumber statik ke laluan yang tidak mengandungi bahagian "apl":

# Default Nette htaccess contents
RewriteEngine On
RewriteRule /\.|^\. - [F]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]

# Added this line under the default Nette htaccess file
RewriteRule ^app(/.*|$)  [NC,L]

Hos maya Apache kekal tidak berubah.

Dengan cara ini, nginx menghantar URL permintaan lengkap (termasuk "apl") ke Apache dan Apache memanggil penghala Nette dengan awalan "aplikasi". Penghalaan kini berfungsi dengan baik kerana "aplikasi" adalah sebahagian daripada URL dan bahkan menyedarinya oleh Nette (kerana ia sebenarnya terdapat sepenuhnya dalam pengepala permintaan). Ini menyebabkan $basePath dan pautan/ubah hala ke berfungsi.

Walau bagaimanapun, sumber statik tidak disampaikan melalui penghala Nette, oleh itu awalan app/ 前缀会导致 Apache 找不到该文件并报告 404。这就是添加重写规则的原因从静态资源的 URL 中删除 app/.

Ia meretas, tetapi ia berfungsi untuk kedua-dua akses proksi dan bukan proksi.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!