Nette derrière l'alias de proxy inverse sur nginx
P粉953231781
P粉953231781 2023-09-04 00:28:05
0
1
498

J'ai une application Nette exécutée sur un serveur Apache2/Debian 11 et elle fonctionne bien. Cependant, nous devons utiliser un alias pour le cacher derrière le proxy nginx.

Supposons que nous ayons un environnement Apache2 parfait fonctionnant sur http://127.0.0.1:89/ et que nous souhaitions y accéder via nginx configuré en tant que proxy inverse sur https://example.com /applications/< ;/p>

les paramètres nginx sont les suivants :

emplacement /app/ { proxy_pass http://127.0.0.1:89 ; proxy_set_header Hôte $host ; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Proto "https" ; proxy_set_header Port X-Forwarded "443" ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } 

Alors que la configuration d'Apache2 reste inchangée avant les tentatives du proxy :

 Administrateur du serveur webmaster@localhost DocumentRoot /var/www/app/www/  Index des options FollowSymLinks Autoriser tout remplacer Exiger que tout soit accordé  

Le problème est que l'application Nette pense toujours qu'elle s'exécute sur un chemin sans la partie URI "/app", donc tous les liens générés via des redirections et des appels de lien (y compris la variable de modèle $basePath) ne sont pas valides. ≪ /p>

J'ai également ajouté les informations de proxy à la configuration de Nette, et comme l'instance nginx s'exécute sur le même serveur, elle ressemble à ceci :

http : proxy : 127.0.0.1

J'ai essayé de configurer la configuration nginx pour transférer le chemin /admin dans l'URI transféré :

proxy_pass http://127.0.0.1:89/admin;

Et j'ai également essayé de jouer avec le routeur Nette pour filtrer la partie "admin/" (sans chercher le AdminPresenter, qui est évidemment manquant) :

$router->addRoute('[admin/]/[/]', 'Page d'accueil : par défaut');

L'application Nette génère cette erreur lors de la tentative d'accès à la page :

TypeError : unpack() s'attend à ce que le paramètre 2 soit une chaîne, bool donné dans /var/www/app/vendor/nette/http/src/Http/Helpers .php:49 @ http://example.com/app/

Quelqu’un peut-il m’indiquer la bonne direction ?

P粉953231781
P粉953231781

répondre à tous (1)
P粉035600555

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//[/]', 'Homepage:default'); $router->addRoute('/[/]', '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$basePathet les liens/redirections.

Cependant, les ressources statiques ne sont pas servies via le routeur Nette, d'où le préfixeapp/前缀会导致 Apache 找不到该文件并报告 404。这就是添加重写规则的原因从静态资源的 URL 中删除app/.

C'est hacky, mais cela fonctionne à la fois pour l'accès proxy et non proxy.

    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!