J'ai modifié mon fichier htaccess de mon site pour faire ce qui suit:
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.
Donc tous les liens internes doivent passer par
example.com/site/.*
Si vous souhaitez "masquer" le /site
sous - répertoire de l'URL, vous devez en fait supprimer le /site
segment de chemin d'URL de tous vos hyperliens internes. Si la /site
partie 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".
- Personne ne doit accéder à l'URL de base (
example.com
) et quiconque tente d'y accéder doit être redirigé versexample.com/site/
- Forcer https sur tous les liens, y compris les URL dans les sous-dossiers et sous-sous-dossiers
- 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 /site
segment URL-chemin (# 3). La "redirection" exposerait le /site
sous - répertoire.
En fait, tout le monde devrait accéder à l'URL de base. /site
n'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 /site
sous - 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:
example.com/
et example.com/foo
) dans le /site
sous - répertoire (par exemple /site/
et /site/foo
respectivement).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 /site
sous - répertoire vers la racine. Mais cela devrait seulement être mis en œuvre si vous avez déjà supprimé /site
de 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.com
et 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 /site
sous - répertoire. Cela exposera le /site
sous - répertoire. Vous vous attendez également à ce que cela crée une boucle de redirection sans fin, sauf si vous avez un autre .htaccess
fichier dans le /site
sous-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 /site
sous - répertoire vers la racine (URL canonique). NB: Uniquement si tous les hyperliens internes ont eu le /site
sous - 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_STATUS
variable 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 /site
sous - 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/site
et 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.
laisse moi dire quelques mots