htaccess перенаправляет без www и HTTP с полным URL

У меня есть . 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 , как я могу этого добиться?

1
задан 24 April 2018 в 18:12
2 ответа

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:

  • Al controlador frontal, no cal capturar la ruta URL (és a dir, (. *) ) 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.
  • Tingueu en compte el $ 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.
  • Us faltaven les marques [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.

2
ответ дан 3 December 2019 в 20:15

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>
0
ответ дан 3 December 2019 в 20:15

Теги

Похожие вопросы