У меня есть . htaccess
rules:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST} [R=301,L]
Он отлично работает при перенаправлении HTTP на HTTPS и без www на www в основном домене, но если пользователь переходит непосредственно на определенный URL, я хочу перенаправить на https, www с полным URL-путь.
Например:
http://example.com/login
должен перенаправлять на https://www.example.com/login
http://www.example.com / login
должен перенаправлять на https://www.example.com/login
https://example.com/login
должен перенаправлять на https: //www.example .com / login
При текущих настройках перенаправляет только на https://www.example.com
или https://www.example.com/index.php
, как я могу этого добиться?
Com va esmentar @GeraldSchneider en els comentaris, les vostres directrius estan en un ordre incorrecte. Les redireccions externes (HTTP a HTTPS i no www a www) necessiten anar abans de al vostre controlador frontal, ja que en cas contrari no es processaran mai per res més que les sol·licituds de fitxers reals. (El controlador frontal encamina totes les sol·licituds desconegudes a index.php
i després atura .)
Tot i això, les vostres redireccions també són incorrectes. Us falta la "URL completa" de la substitució , de manera que, tal com està, sempre es redirigiran de nou a l'arrel del document.
Per tant, proveu alguna cosa així:
RewriteEngine On
# Front-controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]
# HTTP to HTTPS redirect
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]
# Non-www to www redirect
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) http://www.%{HTTP_HOST}/$1 [R=301,L]
Notes sobre el directives anteriors:
(. *)
) si no s’utilitza en la substitució . El senyalador QSA
no és obligatori aquí; la cadena de consulta de la sol·licitud s'afegeix per defecte. $ 1
a la RewriteRule
susbstitution ]: es tracta d'una referència inversa a la ruta URL capturada des de la sol·licitud (és a dir, la "URL completa"). A les dues redireccions no hi faltava. [R = 301, L]
de la redirecció HTTP a HTTPS. Sense indicar explícitament el codi d'estat, això hauria donat lloc a una redirecció temporal 302 i la reescriptura hauria continuat. Si teniu intenció d'implementar HSTS més endavant, aquestes redireccions han d'estar separades. Tot i això, si teniu accés a la configuració del servidor i no teniu intenció d'implementar HSTS, consulteu la resposta de @ HBruijn.
L'ideal és que tingueu accés a la configuració del servidor i no necessiteu fer les redireccions des d'un fitxer .htaccess
i el vostre es converteix en un cas de llibres de text activat quan NO s'utilitza mod_rewrite on configureu les redireccions en entrades específiques de VirtualHost.
<VirtualHost *:80>
# Redirect http://[www.]example.com/login to https://www.example.com/login
ServerName www.example.com
ServerAlias example.com
Redirect "/" "https://www.example.com/"
</VirtualHost>
<VirtualHost *:443>
# Redirect https://example.com/login to https://www.example.com/login
ServerName example.com
Redirect "/" "https://www.example.com/"
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
DocumentRoot /var/www/...
....
</VirtualHost>