Maison > Questions et réponses > le corps du texte
P粉0356005552023-09-04 17:09:20
D'accord, je réponds à ma propre question au cas où quelqu'un aurait le même problème. J'ai l'impression que ma solution est un peu un hack, alors n'hésitez pas à publier des réponses non hackées.
Tout d'abord, j'ai modifié la configuration de 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; }
Ensuite, j'ai modifié la configuration de Nette pour couvrir tous les proxys (probablement pas réellement nécessaires) :
http: proxy: 0.0.0.0/0
J'ai également ajouté la route "app" dans le code du routeur (non pas comme préfixe facultatif, mais comme route régulière) :
$router = new RouteList; $router->addRoute('app/<presenter>/<action>[/<id>]', 'Homepage:default'); $router->addRoute('<presenter>/<action>[/<id>]', 'Homepage:default'); return $router;
A également modifié la méthode de démarrage du code BasePresenter :
$this->template->basePath = '/app'.$this->template->basePath;
Enfin, j'ai modifié le fichier .htaccess pour réécrire les URL de toutes les ressources statiques vers des chemins qui ne contiennent pas la partie "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]
L'hôte virtuel Apache reste inchangé.
De cette façon, nginx transmet l'URL complète de la requête (y compris "app") à Apache, et Apache appelle le routeur Nette en utilisant le préfixe "app". Le routage fonctionne désormais correctement car "application" fait partie de l'URL et en est même consciente par Nette (puisqu'elle est en fait entièrement présente dans l'en-tête de la requête). Cela fait fonctionner $basePath
et les liens/redirections.
Cependant, les ressources statiques ne sont pas servies via le routeur Nette, d'où le préfixe app/
前缀会导致 Apache 找不到该文件并报告 404。这就是添加重写规则的原因从静态资源的 URL 中删除 app/
.
C'est hacky, mais cela fonctionne à la fois pour l'accès proxy et non proxy.