Le fichier htaccess ne redirige pas tous les liens vers https et ne cache pas des parties de l'url

Yumi

J'ai modifié mon fichier htaccess de mon site pour faire ce qui suit:

  1. Personne ne doit accéder à l'URL de base (example.com) et quiconque tente d'y accéder doit être redirigé vers example.com/site/
  2. Forcer https sur tous les liens, y compris les URL dans les sous-dossiers et sous-sous-dossiers
  3. Masquer / site / dans le nom de l'url qui s'affiche

La redirection Https se produit, mais je peux également accéder à la version http de n'importe quelle page en changeant manuellement https en http. De plus, je ne peux pas cacher / site / de l'URL qui s'affiche dans la barre d'adresse. Et non, je n'ai pas accès au fichier vhosts.

Voici comment j'ai modifié mon fichier .htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteCond %{HTTP_HOST} ^example\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [OR]
RewriteCond %{REQUEST_URI} !^(.*)
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteRule ^(.*)$ /site/$1 [L,NC,R]
</IfModule>

Toute aide serait très appréciée.

MrWhite

Donc tous les liens internes doivent passer par example.com/site/.*

Si vous souhaitez "masquer" le /sitesous - répertoire de l'URL, vous devez en fait supprimer le /sitesegment de chemin d'URL de tous vos hyperliens internes. Si la /sitepartie est présente dans le lien alors tous vos utilisateurs peuvent la voir (sur la page et dans la barre d'état - avant de cliquer sur le lien), donc elle n'est pas du tout "cachée".

  1. Personne ne doit accéder à l'URL de base ( example.com) et quiconque tente d'y accéder doit être redirigé versexample.com/site/
  2. Forcer https sur tous les liens, y compris les URL dans les sous-dossiers et sous-sous-dossiers
  3. Masquer /site/dans le nom de l'URL qui s'affiche

Le n ° 1 et le n ° 3 sont une contradiction. Vous ne pouvez pas "rediriger" vers "/ site" (# 1) et masquer le /sitesegment URL-chemin (# 3). La "redirection" exposerait le /sitesous - répertoire.

En fait, tout le monde devrait accéder à l'URL de base. /siten'est pas présent dans l'URL (après l'avoir supprimé de tous vos hyperliens internes). Vous réécrivez ensuite en interne toutes les demandes dirigées vers l'URL de base dans le /sitesous - répertoire. Ceci est entièrement interne au serveur - l'utilisateur n'en est pas conscient. Ce n'est pas une "redirection" externe , c'est une "réécriture" interne .

Les processus réels sont donc:

  1. Forcer HTTPS pour toutes les URL.
  2. Réécrivez en interne toutes les requêtes pour l'URL de base (par exemple example.com/et example.com/foo) dans le /sitesous - répertoire (par exemple /site/et /site/foorespectivement).

Cependant, il existe une étape facultative # 0, s'il s'agit d'une structure d'URL en cours de modification - afin de préserver le référencement et l'accès accidentel. Et c'est pour "rediriger" les demandes directes du /sitesous - répertoire vers la racine. Mais cela devrait seulement être mis en œuvre si vous avez déjà supprimé /sitede tous vos liens internes - sinon , l'utilisateur va être redirigé vers l' extérieur chaque clic, ce qui est « lent » pour vos utilisateurs et aura un impact sur votre serveur. Nous devons également faire attention aux boucles de redirection et ne rediriger que les requêtes directes de l'utilisateur et non les requêtes réécrites par Apache.

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

Si vous n'avez que example.comet www.example.com(comme vous l'avez indiqué dans les commentaires), alors il n'y a pas besoin de toutes les vérifications de nom d'hôte (c'est-à-dire HTTP_HOST) - elles sont également dupliquées, donc vous vérifiez la même chose plus d'une fois ici.

La condition selon laquelle les vérifications %{REQUEST_URI} !^(.*)échoueront toujours («rien» est toujours faux). C'est seulement parce que la condition est OU que la règle est capable de faire n'importe quoi.

Le dernier RewriteRule"redirige" inconditionnellement tout vers le /sitesous - répertoire. Cela exposera le /sitesous - répertoire. Vous vous attendez également à ce que cela crée une boucle de redirection sans fin, sauf si vous avez un autre .htaccessfichier dans le /sitesous-répertoire qui empêche cela.

^(.*)$- il n'est pas nécessaire de capturer le chemin de l'URL, si vous n'utilisez pas la référence arrière dans la RewriteRule substitution . Dans votre redirection HTTP vers HTTPS, cela pourrait être simplifié à juste ^- car il doit simplement réussir pour chaque requête.

Essayez plutôt ce qui suit:

RewriteEngine On

# 1. HTTP to HTTPS redirect (same host)
RewriteCond %{SERVER_PORT} 80
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# 2. Internally rewrite all requests to the /site subdirectory
#    Except for requests that are already for the /site subdirectory - prevent rewrite loop
RewriteRule !^site/ /site%{REQUEST_URI} [L]

Pas besoin d' <IfModule>emballage.

Et, éventuellement, rediriger vers l'extérieur les requêtes directes du /sitesous - répertoire vers la racine (URL canonique). NB: Uniquement si tous les hyperliens internes ont eu le /sitesous - répertoire supprimé de l'URL. Cela irait avant les directives ci-dessus.

# 0. Redirect direct /site requests back to the root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^site/(.*) https://%{HTTP_HOST}/$1 [R=301,L]

La condition qui vérifie par rapport à la REDIRECT_STATUSvariable d'environnement est (probablement) requise afin d'éviter une boucle de redirection, car nous ne voulons pas rediriger la demande déjà réécrite par la règle n ° 2.

Il est préférable de tester d'abord avec 302 redirections (temporaires) afin d'éviter d'éventuels problèmes de mise en cache.

Vous devrez vider le cache de votre navigateur avant de tester.

Envisagez également de canaliser le sous-domaine www.


MISE À JOUR n ° 1: Pour pouvoir accéder à d'autres fichiers dans la racine du document ou à des fichiers en dehors du /sitesous - répertoire, vous devrez ajouter une condition à la règle n ° 2 pour exclure les demandes qui mappent directement aux fichiers. Par exemple:

# 2. Internally rewrite all requests to the /site subdirectory
#    Except for requests that are already for the /site subdirectory - prevent rewrite loop
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^site/ /site%{REQUEST_URI} [L]

MISE À JOUR # 2: J'ai maintenant perdu l'accès à un répertoire protégé par mot de passe à example.com/site2. Il redirige vers /siteet dit "fichier non trouvé".

Vous pouvez soit faire une exception uniquement pour ce sous-répertoire. Par exemple, modifiez la règle ci-dessus comme ceci:

# 2. Internally rewrite all requests to the /site subdirectory
#    Except for requests that are already for the /site or /site2 subdirectories
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^(site|site2) /site%{REQUEST_URI} [L]

OU, faites une exception pour tous les répertoires, à l'exception du répertoire racine, qui aurait encore besoin d'être réécrit /site/afin de serveur votre page d'accueil. Par exemple:

# 2. Internally rewrite all requests to the /site subdirectory
#    Except for requests that are already for the /site subdirectory
#    Or any [sub]directory...
RewriteCond %{REQUEST_URI} ^/$ [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^site /site%{REQUEST_URI} [L]

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

HTTP ne redirige pas vers HTTPS (SpringBoot)

Http ne redirige pas vers https nginx

Le fichier .htaccess ne redirige pas http: // www. à https: // www

l'essaim de docker avec le fichier de composition ne reconnaît pas les "liens"

Le fichier htaccess ne redirige pas la requête de niveau racine vers le niveau de sous-répertoire

La redirection .htaccess ne redirige pas vers le fichier spécifié

L'araignée d'exploration Scrapy ne suit pas tous les liens et ne remplit pas le chargeur d'éléments

Le routage angulaire ne fonctionne pas, il me redirige vers l'url de base

Le routage des enfants ne fonctionne pas et l'application redirige vers la page 404

htaccess redirige tous les liens sauf l'URL de base

Cloudfront ne redirige pas correctement vers https et le sous-domaine

htaccess Fonctionne bien pour tous les liens, mais peu de liens ne fonctionnent pas

htaccess ne redirige pas toutes les pages ou URL non trouvées sur le site vers 404 pages

htaccess supprime le segment de l'url et redirige vers https et www

Lors du tricotage d'un fichier Rmd en pdf, les hashtags dans les liens vers des livres de livres sont convertis en% 23 et ne fonctionnent pas

Htaccess ne redirige pas vers un fichier pour le convertir en webp à la volée

codeigniter ne redirige pas vers l'URL utf-8

La réécriture de l'URL avec .htaccess ne redirige pas vers la nouvelle URL

Le servlet ne redirige pas vers l'URL avec des paramètres

La page ne redirige pas vers l'URL mise à jour

Le menu déroulant n'affiche pas tous les liens et ne peut pas changer la couleur des icônes de médias sociaux CSS

Nginx ne redirige pas vers les ports docker https

AJAX ne redirige pas vers le fichier PHP

.htaccess ne redirige pas http vers https

La sortie ls distante ne redirige pas vers le fichier

Les liens des éléments de menu déroulant ne fonctionnent pas dans les rails et le bootstrap4

Le fichier .htaccess ne redirige pas les scripts et les styles lorsqu'ils sont appelés dans un fichier de script

renvoie faux ; et preventDefault(); Ca ne fonctionne pas. Onclick redirige vers l'URL du lien de l'image

Pourquoi mon fichier .htaccess ne redirige-t-il pas vers https ? Comment réparer?

TOP liste

chaudétiquette

Archive