我正在嘗試為單個頁面應用程式的兩個不同版本提供服務——一個是使用全新的、閃亮的 JS 框架構建的,另一個是使用舊的、更簡陋的 JS 框架構建的。所有重要的特性和功能都在新的 SPA 中,所有的非關鍵特性和功能都在舊的 SPA 中,并且正在被移植。
考慮到這一點,我試圖通過路徑使舊的 SPA 可用,例如/old-app.
新應用程式位于/www/new-app. 舊應用程式位于/www/old-app.
這是我嘗試過的:
server {
listen 443;
root /www/new-app;
index index.html;
location / { # default to new app
try_files $uri @prerender;
}
location /old-app {
root /www/old-app; # I have also tried *alias* instead of *root* here
index index.html;
try_files $uri @prerender;
}
location @prerender {
set $prerender = 0;
# a bunch of rules for prerender from here: https://gist.github.com/thoop/8165802
if ($prerender = 1) {
proxy_pass http://127.0.0.1:8080/$scheme://$host$request_uri;
}
if ($prerender = 0) {
rewrite .* /index.html break;
}
}
}
上面回傳一個200 OKfor https://www.domain.example/old-app/<route>,但服務的頁面不是/www/old-app/index.html。相反,提供的檔案來自/www/new-app/index.html一個空白頁,大概是因為新的 SPA 不理解提供的/<route>,只有舊的 SPA 理解。
uj5u.com熱心網友回復:
這里有兩件事是錯誤的。
location /old-app {
root /www/old-app;
這將在以下位置查找檔案/www/old-app/old-app(有關詳細資訊,請參閱本檔案)。
try_files $uri @prerender;
這會將您的所有路線發送到該location @prerender塊,該塊以rewrite .* /index.html break;
可能有一個更優雅的解決方案,但您可以添加第二個“prerender”塊,例如location @oldrender,它與原始塊相似,但以rewrite ^ /old-app/index.html last;
例如:
location /old-app {
root /www;
try_files $uri @oldrender;
}
location @oldrender {
...
rewrite ^ /old-app/index.html last;
...
}
請注意root已更改,您需要使用rewrite...last.
uj5u.com熱心網友回復:
雖然理查德的答案有效并且可能比我的更正確,但經過大量試驗和錯誤,我最終得到了以下配置(在理查德有機會發布他的答案之前!)。如果其他人有與我相同的要求,我將其發布在這里以供后代使用。
server {
listen 443;
root /www/new-app;
index index.html;
# I left the following alone
location / {
try_files $uri @prerender;
}
# Here's the meat of what worked
location /old-app {
alias /www/old-app;
index index.html;
try_files $uri $uri/ index.html;
}
}
最后,在index.html舊的單頁應用程式中,我添加了一個<base href="/old-app/" />以確保從正確的服務器路徑提供對影像、樣式表等的任何參考。
現在,訪問http://domain.example/old-app正確服務于舊 SPA 的默認路由!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/422868.html
標籤:
