P粉0356005552023-09-04 17:09:20
好吧,回答我自己的問題,以防有人遇到同樣的問題。我覺得我的解決方案有點黑客,所以請隨意發布非黑客答案。
首先,我修改了 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; }
然後我修改了 Nette 配置以覆寫所有代理程式(可能實際上並不需要):
http: proxy: 0.0.0.0/0
我還在路由器程式碼中加入了「app」路由(不是作為可選前綴,而是作為常規路由):
$router = new RouteList; $router->addRoute('app/<presenter>/<action>[/<id>]', 'Homepage:default'); $router->addRoute('<presenter>/<action>[/<id>]', 'Homepage:default'); return $router;
也修改了BasePresenter程式碼啟動方法:
$this->template->basePath = '/app'.$this->template->basePath;
最後,我修改了.htaccess文件,將所有靜態資源的URL重寫為不包含「app」部分的路徑:
# 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]
Apache 虛擬主機維持不變。
這樣,nginx 將完整的請求 URL(包括「app」)傳遞給 Apache,Apache 使用「app」前綴呼叫 Nette 路由器。路由現在運作正常,因為「應用程式」是 URL 的一部分,甚至可以被 Nette 感知(因為它實際上完全存在於請求標頭中)。這會導致 $basePath
和 links/redirect 工作。
但是,靜態資源不是透過 Nette 路由器提供的,因此 app/
前綴會導致 Apache 找不到該檔案並報告 404。這就是為什麼新增重寫規則的原因從靜態資源的 URL 中刪除 app/
前綴。
它很hacky,但它適用於代理和非代理存取。