SPIP en https derrière un reverse-proxy

Salut à tous,

J'ai un serveur web derrière un reverse-proxy, sur lequel j'ai des sites
(sous SPIP mais pas seulement). Tous les sites sont en https, et j'ai
pratiquement la même config partout à savoir :
- sur le reverse-proxy : une redirection http vers https puis
redirection vers le serveur web
- sur le serveur web : une configuration en http simple

Alors tout fonctionne bien sur tous les sites (j'ai du owncloud, du
vtiger, du omv, du proxmox, du gitlab, etc.) sauf sur les sites SPIP.
J'accède bien à tous les sites, depuis l'extérieur et depuis le LAN, en
https://.

Sur les sites SPIP, il y a plein de contenus manquants. Sur la console
Firefox, je vois bien que de nombreux appels (vers le cache, vers des
scripts, vers des css...) se font en http simple et donc sont bloqués :

Blocage du chargement du contenu mixte actif (mixed active content) «
http://monserveur.com/local/cache-css/… »
Blocage du chargement du contenu mixte actif (mixed active content) «
http://monserveur.com/ecrire/?exec=article_edit&id_article=25… »

Je pense que cela n'arriverait pas si on savait dire à SPIP que les
liens sont tous en https et non pas en http...

Est-ce qu'il y a un moyen d'indiquer à SPIP que le site est derrière un
proxy ET en https ?
Est-ce que sinon, ça peut se régler par la configuration du serveur apache ?

Merci pour votre aide et vos conseils :wink:

++
Cyril

PS : Voici ma configuration Apache.

Sur le reverse-proxy une redirection de http vers https,
puis vers le serveur web :

<VirtualHost *:80>
ServerName monserveur.com
ServerSignature Off
RewriteEngine on
RewriteCond %{HTTP_HOST} ^monserveur.com$
RewriteRule ^(.*) https://monserveur.com$1 [QSA,P,L,R=301]
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>

     SSLEngine on
     SSLCertificateFile /etc/crt/fullchain\.pem
     SSLCertificateKeyFile /etc/crt/privkey\.pem

     ServerName monserveur\.com
     ServerSignature Off

     &lt;IfModule mod\_proxy\.c&gt;

         RewriteEngine On
         ProxyVia On
         ProxyRequests Off

         \# IP du serveur web
         ProxyPass / http://192.168.1.100/
         ProxyPassReverse / http://192.168.1.100/

         ProxyPreserveHost On

        &lt;Proxy \*&gt;
             Options FollowSymLinks MultiViews
             AllowOverride All
             Order allow,deny
             allow from all
             Require all granted
         &lt;/Proxy&gt;

     &lt;/IfModule&gt;

 &lt;/VirtualHost&gt;

</IfModule>

Et sur le serveur web, juste la conf en http :
Alias /mercycle "/var/www/mercycle.com/html/"

<VirtualHost *:80>

 ServerName monserveur\.com
 DocumentRoot /var/www/monserveur\.com/html/

 \# IP du reverse\-proxy
 RemoteIPInternalProxy 172\.168\.1\.100

 RemoteIPHeader X\-Forwarded\-For
 RemoteIPProxyProtocol On

 &lt;Directory /var/www/monserveur\.com/html/&gt;
   Options \+FollowSymlinks
   AllowOverride All
   &lt;IfModule mod\_dav\.c&gt;
     Dav off
   &lt;/IfModule&gt;
   SetEnv HOME /var/www/monserveur\.com/html
   SetEnv HTTP\_HOME /var/www/monserveur\.com/html
 &lt;/Directory&gt;

</VirtualHost>

Salut Cyril,

tu as bien modifié l'url dans identité du site pour qu'elle soit en https ?

++

tofulm

Le 25/04/2019 à 17:52, Cyril Marion a écrit :

Salut à tous,

J'ai un serveur web derrière un reverse-proxy, sur lequel j'ai des sites
(sous SPIP mais pas seulement). Tous les sites sont en https, et j'ai
pratiquement la même config partout à savoir :
- sur le reverse-proxy : une redirection http vers https puis
redirection vers le serveur web
- sur le serveur web : une configuration en http simple

Alors tout fonctionne bien sur tous les sites (j'ai du owncloud, du
vtiger, du omv, du proxmox, du gitlab, etc.) sauf sur les sites SPIP.
J'accède bien à tous les sites, depuis l'extérieur et depuis le LAN, en
https://.

Sur les sites SPIP, il y a plein de contenus manquants. Sur la console
Firefox, je vois bien que de nombreux appels (vers le cache, vers des
scripts, vers des css...) se font en http simple et donc sont bloqués :

Blocage du chargement du contenu mixte actif (mixed active content) «
http://monserveur.com/local/cache-css/… »
Blocage du chargement du contenu mixte actif (mixed active content) «
http://monserveur.com/ecrire/?exec=article_edit&id_article=25… »
...

Je pense que cela n'arriverait pas si on savait dire à SPIP que les
liens sont tous en https et non pas en http...

Est-ce qu'il y a un moyen d'indiquer à SPIP que le site est derrière un
proxy ET en https ?
Est-ce que sinon, ça peut se régler par la configuration du serveur apache ?

Merci pour votre aide et vos conseils :wink:

++
Cyril

PS : Voici ma configuration Apache.

Sur le reverse-proxy une redirection de http vers https,
puis vers le serveur web :

<VirtualHost *:80>
ServerName monserveur.com
ServerSignature Off
RewriteEngine on
RewriteCond %{HTTP_HOST} ^monserveur.com$
RewriteRule ^(.*) https://monserveur.com$1 [QSA,P,L,R=301]
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>

     SSLEngine on
     SSLCertificateFile /etc/crt/fullchain\.pem
     SSLCertificateKeyFile /etc/crt/privkey\.pem

     ServerName monserveur\.com
     ServerSignature Off

     &lt;IfModule mod\_proxy\.c&gt;

         RewriteEngine On
         ProxyVia On
         ProxyRequests Off

         \# IP du serveur web
         ProxyPass / http://192.168.1.100/
         ProxyPassReverse / http://192.168.1.100/

         ProxyPreserveHost On

        &lt;Proxy \*&gt;
             Options FollowSymLinks MultiViews
             AllowOverride All
             Order allow,deny
             allow from all
             Require all granted
         &lt;/Proxy&gt;

     &lt;/IfModule&gt;

 &lt;/VirtualHost&gt;

</IfModule>

Et sur le serveur web, juste la conf en http :
Alias /mercycle "/var/www/mercycle.com/html/"

<VirtualHost *:80>

 ServerName monserveur\.com
 DocumentRoot /var/www/monserveur\.com/html/

 \# IP du reverse\-proxy
 RemoteIPInternalProxy 172\.168\.1\.100

 RemoteIPHeader X\-Forwarded\-For
 RemoteIPProxyProtocol On

 &lt;Directory /var/www/monserveur\.com/html/&gt;
   Options \+FollowSymlinks
   AllowOverride All
   &lt;IfModule mod\_dav\.c&gt;
     Dav off
   &lt;/IfModule&gt;
   SetEnv HOME /var/www/monserveur\.com/html
   SetEnv HTTP\_HOME /var/www/monserveur\.com/html
 &lt;/Directory&gt;

</VirtualHost>

_______________________________________________
liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Archives : https://www.mail-archive.com/spip@rezo.net/maillist.html

Infos : https://listes.rezo.net/mailman/listinfo/spip

Documentation de SPIP : http://www.spip.net/

Irc : de l'aide à toute heure : http://spip.net/irc

--
A bientôt,
tofulm

Le 25/04/2019 à 18:00, tofulm a écrit :

tu as bien modifié l'url dans identité du site pour qu'elle soit en https ?

Yes Sir :wink:

++
Cyril

Je ne connais pas bien apache en reverse proxy mais il faut bien s’assurer à faire passer les directives « host header »

sur nginx ça ressemble a ça:

proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;

Dans un info.php sur le backend tu peux verifier que tout les X-Forwarded-for sont correct.

Si jamais en dernier recours tu peux dire a spip que le reverse proxy est mal configuré :slight_smile:

dans mes_options.php:
define(‹ _PORT_HTTPS_STANDARD ›, ‹ 443,80 ›);

Le jeu. 25 avr. 2019 à 18:03, Cyril Marion <cyril@cym.fr> a écrit :

Le 25/04/2019 à 18:00, tofulm a écrit :

tu as bien modifié l’url dans identité du site pour qu’elle soit en https ?

Yes Sir :wink:

++
Cyril


liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Archives : https://www.mail-archive.com/spip@rezo.net/maillist.html

Infos : https://listes.rezo.net/mailman/listinfo/spip

Documentation de SPIP : http://www.spip.net/

Irc : de l’aide à toute heure : http://spip.net/irc

Hello,

Le souci vient bien de là, les headers qu’attend SPIP pour du HTTPS ne sont pas configuré.
Sur les sites de recettes de ma boîte, j’ai ajouté quelques lignes dans mes_options.php
Cf. https://contrib.spip.net/Passer-un-site-SPIP-sous-https#Autres-ressources-sur-https

Voilà,

hello, 

Regarde ces directives dans la conf du reverse proxy

X-Forwarded-Proto: https
X-Forwarded-Port: 443

Le ven. 26 avr. 2019 à 06:51, Ybbet SPIP <teddy.spip@gmail.com> a écrit :

Hello,

Le souci vient bien de là, les headers qu’attend SPIP pour du HTTPS ne sont pas configuré.
Sur les sites de recettes de ma boîte, j’ai ajouté quelques lignes dans mes_options.php
Cf. https://contrib.spip.net/Passer-un-site-SPIP-sous-https#Autres-ressources-sur-https

Voilà,


Ybbet

Le 25 avr. 2019 à 18:28, pierre laszczak <pierre.laszczak@gmail.com> a écrit :

Je ne connais pas bien apache en reverse proxy mais il faut bien s’assurer à faire passer les directives « host header »

sur nginx ça ressemble a ça:

proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;

Dans un info.php sur le backend tu peux verifier que tout les X-Forwarded-for sont correct.

Si jamais en dernier recours tu peux dire a spip que le reverse proxy est mal configuré :slight_smile:

dans mes_options.php:
define(‹ _PORT_HTTPS_STANDARD ›, ‹ 443,80 ›);

Le jeu. 25 avr. 2019 à 18:03, Cyril Marion <cyril@cym.fr> a écrit :

Le 25/04/2019 à 18:00, tofulm a écrit :

tu as bien modifié l’url dans identité du site pour qu’elle soit en https ?

Yes Sir :wink:

++
Cyril


liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Archives : https://www.mail-archive.com/spip@rezo.net/maillist.html

Infos : https://listes.rezo.net/mailman/listinfo/spip

Documentation de SPIP : http://www.spip.net/

Irc : de l’aide à toute heure : http://spip.net/irc


liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Archives : https://www.mail-archive.com/spip@rezo.net/maillist.html

Infos : https://listes.rezo.net/mailman/listinfo/spip

Documentation de SPIP : http://www.spip.net/

Irc : de l’aide à toute heure : http://spip.net/irc

Merci Teddy :wink:

Cela fonctionne, même avec seulement juste la 1ère instruction HTTPS à ‹ on › :

$_SERVER['HTTPS'] = 'on';

Maintenant que je sais quelle variable changer, je vais tenter de le faire dans la configuration du reverse-proxy.

Bonjour Pierre, merci de m’avoir répondu.
Pour l’instant c’est l’astuce de Ybbet qui fonctionne (mes_options) donc en adaptant la configuration coté serveur web (et pas coté reverse-proxy).

J’ai tenté de régler les variables coté reverse-proxy dans la configuration apache du domaine, avec des setEnv, mais c’est absolument sans effet

SetEnv X-Forwarded-Proto https
SetEnv X-Forwarded-Port 443

Alors je les mets peut-être pas au bon endroit… JE vais en rester là pour l’instant, en attendant de pouvoir faire les réglages coté revers-proxy et non pas coté serveur web.

Merci encore,
Cyril

Et tu sais ce qu'elle te dit ma musique ?

Nan mé oh !

--
nicod_

C est pas un setenv mais un set header sur le reverse proxy.

RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}%
RequestHeader set X-Forwarded-Port expr=%{SERVER_PORT}%

Quand bien même le backend ne réponde qu’en http, l’application devrait être en mesure de connaître la façon de retourner des url avec le bon protocole grace au « X-Forwarded »
En théorie, qu’on request le proxy en HTTPS ou HTTP, l’application en backend devrait retourner les url de ressources correctement sans réglage particulier.
Une fois que l’appli fonctionne sur les 2 protocoles on peut forcer la redirection sur du https only.

Voilà, cordialement.

Le sam. 27 avr. 2019 à 01:33, nicod_ <nicod@lerebooteux.fr> a écrit :

Et tu sais ce qu’elle te dit ma musique ?

Nan mé oh !


nicod_


liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Archives : https://www.mail-archive.com/spip@rezo.net/maillist.html

Infos : https://listes.rezo.net/mailman/listinfo/spip

Documentation de SPIP : http://www.spip.net/

Irc : de l’aide à toute heure : http://spip.net/irc

A écouter sur ton enceinte à la prochaine SPIP-Party :slight_smile:

Bises
++
Cyril
Le 27/04/2019 à 01:31, nicod_ a écrit :

Et tu sais ce qu'elle te dit ma musique ?

Nan mé oh !

Bonsoir à tou.te.s et merci à ceux qui m’ont répondu :wink:

Avec une configuration classique Apache sur le reverse-proxy et sur le serveur web j’obtiens sur la console de debug de firefox les erreurs suivantes :

Blocage du chargement du contenu mixte actif (mixed active content) « »[En savoir plus] ecrire Blocage du chargement du contenu mixte actif (mixed active content) « »[En savoir plus] ecrire Blocage du chargement du contenu mixte actif (mixed active content) « »[En savoir plus] ecrire Blocage du chargement du contenu mixte actif (mixed active content) « »[En savoir plus] ecrire Blocage du chargement du contenu mixte actif (mixed active content) « »[En savoir plus] ecrire Blocage du chargement du contenu mixte actif (mixed active content) « »[En savoir plus]

Si j’ajoute les lignes suivantes dans le fichier de configuration du site web sur le reverse-proxy (après avoir activé le mod_header d’Apache) :

RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}%
RequestHeader set X-Forwarded-Port expr=%{SERVER_PORT}%

cela ne change rien, j’ai toujours les mêmes erreurs. J’ai même essayé une variante, toujours sur le reverse-proxy :

RequestHeader set X-Forwarded-Proto « https »
RequestHeader set X-Forwarded-Port « 443 »

mais toujours les même erreurs.

Pour résoudre le problème et éliminer les erreurs, il a fallu que je rajoute sur le serveur web (pas sur le reverse-proxy), dans le mes_options.php du site, les 2 lignes suivantes, comme le proposait Ybbet :

$_SERVER[‹ HTTPS ›] = ‹ on ›;
$_SERVER[‹ SERVER_PORT ›] = ‹ 443 ›;

Avec ces 2 lignes dans le mes_options, plus d’erreur !

A votre avis, comme tous les sites hébergés sur ce serveur sont similaires (même version de SPIP) est-ce qu’il y a un moyen que ces 2 lignes puissent être « mutualisées » et mises quelque-part dans la configuration du serveur web ? (dans le php.ini ?)

Merci :wink:

Bonsoir,

Je remercie Ybbet et Pierre Laszczak de m’avoir répondu :slight_smile:

Pour archive, et après avoir exploité toutes vos réponses, après avoir constaté que rajouter les lignes suivantes dans ‹ mes_options.php › fonctionnait très bien (pour SPIP évidemment) :

$_SERVER['HTTPS'] = 'on';
$_SERVER['SERVER_PORT'] = '443';

J’ai cherché à configurer ces variables ailleurs que dans du php (dans la conf serveur par exemple) et sous Apache j’ai finalement trouvé la solution universelle, qui fonctionne sous Php5.6 et Php 7, pour SPIP mais aussi WP, moodle, vtiger…

Voici les lignes que j’ai ajoutées à chacun de mes vhosts Apache :

SetEnv HTTPS On
SetEnv SERVER_PORT 443

Encore merci,

++
Cyril