آپاچی؛ شب ۲۵: پراکسی زیرمسیر، redirect و cookie
فهرست نوشته
برنامهای که در ریشه کار میکند الزاماً زیر /service/ درست کار نمیکند. امشب مسیر درخواست، redirect و cookie را جدا بررسی میکنیم و محدودیت بازنویسی پراکسی را میشناسیم.
این جلسه بخشی از دورهٔ آپاچی در ۵۰ شب است. قرارداد نامها، مسیرها و روش اعمال تغییر را در راهنمای دوره بخوان.
محیط: سایت app شب بیستوچهارم و backend روی 8080؛ از APP_CONF backup بگیر. این شاخه پس از تمرین به config شب قبل برمیگردد.
ترتیب مسیرها#
دو ProxyPass قبلی ریشه را بردار و نگاشت زیر را جایگزین کن:
ProxyPass /service/ http://127.0.0.1:8080/
ProxyPassReverse /service/ http://127.0.0.1:8080/
ProxyPassReverseCookiePath / /service/
در این حالت /service/readme.txt به /readme.txt در backend میرود. slash دو طرف را هماهنگ نگه دار. اگر نگاشت عمومی / نیز داری، مسیرهای خاص و استثناهای ! را پیش از آن قرار بده؛ اولین تطبیق اهمیت دارد.
فایل readme.txt را در backend بساز و از URL عمومی درخواست بده. پاسخ باید همان فایل را بدهد و لاگ backend مسیر بدون prefix را نشان دهد.
دادهٔ بازگشتی برنامه#
سرور سادهٔ Python شب قبل cookie یا redirect برنامهای تولید نمیکند. برای برنامهٔ واقعی، یک endpoint دارای redirect و یک endpoint دارای Set-Cookie انتخاب کن و خروجی را قبل و بعد از proxy با curl -D - مقایسه کن. انتظار داریم Location مربوط به backend، پس از ProxyPassReverse به نشانی عمومی برگردد.
اگر backend واقعاً cookie با Domain=backend.example.test میفرستد، اضافه کن:
ProxyPassReverseCookieDomain backend.example.test app.example.test
cookie بدون Domain به این تبدیل نیاز ندارد. Secure، HttpOnly و SameSite را بر اساس کاربرد در برنامه تنظیم کن؛ تغییر سراسری و کور همهٔ cookieها ممکن است ورود و ارتباط میان سایتها را خراب کند.
ProxyPreserveHost On فقط وقتی مناسب است که برنامه Host عمومی را انتظار دارد و نامهای مجاز را اعتبارسنجی میکند. لینک مطلق داخل HTML، مسیر JavaScript و WebSocket را خود برنامه باید با base URL سازگار تولید کند؛ ProxyPassReverse همهٔ آنها را اصلاح نمیکند.
بازگشت و تمرین: config ریشهٔ شب بیستوچهارم را بازیابی کن. در طرح تحویل بنویس برنامه زیرمسیر را پشتیبانی میکند یا بهتر است میزبان جدا داشته باشد؛ redirect سالم ولی CSS خراب، نشانهٔ ناقص بودن سازگاری زیرمسیر است.