Back to Question Center
0

Semalt: Pourquoi mon fichier .htaccess ne force-t-il que partiellement HTTPS et WWW?

1 answers:

J'ai le domaine https: // www. Exemple. com et c'est ainsi que je préfère que les utilisateurs atteignent aussi mon site, en utilisant à la fois HTTPS et WWW.

Dans mon . Fichier htaccess J'essaie de forcer tout le monde à utiliser cette configuration avec le code suivant

    RewriteEngine sur
RewriteCond% {HTTP_HOST} ^ exemple \ - yokohama wdrive. com [NC]
RewriteCond% {SERVER_PORT} 80
RewriteRule ^ (. *) $ https: // www. Exemple. com / $ 1 [R = 301, L]    

Qui semble fonctionner correctement, tous les utilisateurs qui tapent exemple. com sera dirigé vers la version HTTPS avec le sous-domaine www.

MAIS! Si un utilisateur devait entrer www. Exemple. com OU http: // www. Exemple. com ils ne sont pas redirigés vers la version HTTPS, ce qui peut être à l'origine de cela?

Je travaille également sur la préparation du SEO pour ce domaine et Semalt me ​​donne deux listes par résultat, une pour la version http du site et une pour la version https du site, je suppose que cela a quelque chose à faire avec les problèmes de redirection ainsi.

MISE À JOUR

C'est mon entier . Fichier htaccess car il prend en compte vos dernières modifications suggérées:

    RewriteEngine sur
RewriteCond% {HTTPS}! Sur [OR]
RewriteCond% {HTTP_HOST} = goodies. non [NC]
RewriteRule (. *) https: // www. goodies. non / 1 $ [R = 301, L]#RewriteCond% {HTTP_HOST} ^ goodies \. non [NC]
#RewriteCond% {SERVER_PORT} 80
#RewriteRule ^ (. *) $ https: // www. goodies. non / 1 $ [R = 301, L]# compresser le texte, html, javascript, css, xml:
AddOutputFilterByType DEFLATE text / plain
AddOutputFilterByType DEFLATE text / html
AddOutputFilterByType DEFLATE text / xml
AddOutputFilterByType DEFLATE text / css
AddOutputFilterByType Application DEFLATE / xml
AddOutputFilterByType Application DEFLATE / xhtml + xml
AddOutputFilterByType Application DEFLATE / rss + xml
AddOutputFilterByType Application DEFLATE / javascript
AddOutputFilterByType Application DEFLATE / x-javascript# Ou compresser certains types de fichiers par extension:

SetOutputFilter DEFLATE


SetOutputFilter DEFLATE


SetOutputFilter DEFLATE


SetOutputFilter DEFLATE


SetOutputFilter DEFLATE
## EXPIRE CACHING ##

ExpiresActive On
ExpiresByType image / jpg "accès 1 an"
ExpiresByType image / jpeg "accès 1 année"
ExpiresByType image / gif "accès 1 an"
ExpiresByType image / png "accès 1 an"
ExpiresByType text / css "accès 1 mois"
ExpiresByType text / html "accès 1 mois"
ExpiresByType application / pdf "accès 1 mois"
ExpiresByType text / x-javascript "accès 1 mois"
Application ExpiresByType / x-shockwave-flash "accès 1 mois"
ExpiresByType image / x-icon "accès 1 an"
ExpiresDefault "accès 1 mois"

## EXPIRE CACHING ##    

Je viens de commenter la partie qui fonctionnait et, comme vous pouvez le voir, il y a aussi des règles de compression et de mise en cache.

MISE À JOUR # 2 (ACTUELLEMENT MISE À JOUR 3, NOUVEAU TEST. FICHIER PHP)

voici le contenu du test. fichier php qui est maintenant disponible à https: // goodies. non / test. php

        

Ceci produit seulement le texte "la variable est" et rien d'autre. Suis-je loin . J'ai l'impression que je suis loin. : /

February 8, 2018

Vous devez changer votre logique. Vos conditions sont implicitement AND'd (la valeur par défaut), elles devraient être OR à la place. Donc, actuellement le RewriteRule n'est traité que si le HTTP_HOST est "exemple. com "ET le SERVER_PORT est 80. Vous en avez besoin pour déclencher dans l'une de ces conditions, vous devez donc ajouter un drapeau OU à la première condition.

Par exemple:

  RewriteCond% {HTTP_HOST} ^ exemple \. com $ [NC, OR]
RewriteCond% {SERVER_PORT} 80
RewriteRule (. *) https: // www. Exemple. com / $ 1 [R = 301, L] 

(Pas besoin d'ancrages de cordes à savoir. ^ et $ si vous capturez le motif entier. )

UPDATE: Sinon, vérifiez la variable serveur HTTPS , au lieu de SERVER_PORT . Par exemple:

  RewriteCond% {HTTPS}! Sur [OU]
RewriteCond% {HTTP_HOST} = exemple. com [NC]
RewriteRule (. *) https: // www. Exemple. com / $ 1 [R = 301, L] 

Ce que cela dit est pour chaque requête qui n'est pas HTTPS ou est pour exemple. com (ie. non www ) puis rediriger vers https: // www. Exemple. com .

Vous pouvez également implémenter ceci comme deux règles distinctes:

  RewriteCond% {HTTPS}! On
RewriteRule (. *) https: // www. Exemple. com / $ 1 [R = 301, L]RewriteCond% {HTTP_HOST} = exemple. com [NC]
RewriteRule (. *) https: // www. Exemple. com / $ 1 [R = 301, L] 

DÉBOGAGE: Testez ce que ces variables de serveur contiennent sur votre serveur. Vous pouvez (temporairement) remplacer la redirection ci-dessus par ce qui suit:

  RewriteCond% {SERVER_PORT} (. *)
RewriteRule ^ - [E = ENV_SERVER_PORT:% 1]RewriteCond% {HTTPS} (. *)
RewriteRule ^ - [E = ENV_HTTPS:% 1] 

Cela créera deux variables d'environnement ( ENV_SERVER_PORT et ENV_HTTPS ) qui devraient être disponibles pour votre script côté serveur (par ex.PHP). Vérifiez ce qu'ils contiennent. (par exemple. en PHP echo getenv ('ENV_SERVER_PORT'); )

Sous HTTP, vous vous attendriez ENV_SERVER_PORT être 80 et ENV_HTTPS être " off ".

Sous HTTPS vous vous attendriez ENV_SERVER_PORT être 443 (par défaut) et ENV_HTTPS être " sur ".

Solution

Il semblerait que les variables serveur SERVER_PORT et HTTPS Apache ne sont pas disponibles. Cela suggère que vous avez un proxy frontal (ou un équilibreur de charge) qui gère la demande.

Les connexes (mais pas exactement les mêmes - en dépit d'avoir le même nom) PHP superglobals SERVER_PORT et HTTPS (en particulier $ _SERVER [' SERVER_PORT '] et $ _SERVER [' HTTPS '] ) sont cependant définis (par PHP). Mais SERVER_PORT est toujours 80 lorsqu'il est servi sur HTTP et HTTPS (cela suggère également un proxy frontal). Le superglobal PHP HTTPS est cependant correctement défini sur "on" lorsqu'il est servi via HTTPS. Mais nous voulons éviter de faire cette redirection dans notre code (moins efficace, plus de chance d'erreur).

De votre sortie serveur, il semble qu'il y ait un en-tête de requête HTTP X-Proto (identifié par l'index HTTP_X_PROTO dans le tableau superglobal $ 1SERVER ) étant défini (très probablement par le serveur proxy) lorsqu'il est servi via HTTPS (il est défini sur la chaîne "SSL"), mais lorsqu'il est servi sur une connexion HTTP simple, cet en-tête n'est pas défini. Nous devrions être en mesure de vérifier cela dans . htaccess . Essayez ce qui suit:

  RewriteCond% {HTTP: X-Proto}! SSL [OR]
RewriteCond% {HTTP_HOST} = exemple. com [NC]
RewriteRule (. *) https: // www. Exemple. com / $ 1 [R = 301, L] 

Pour toutes les demandes qui n'ont pas d'en-tête de requête HTTP X-Proto défini sur la chaîne "SSL" ou le domaine apex est demandé puis redirigé vers HTTPS avec le www sous-domaine.