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,但它适用于代理和非代理访问。