Forzar HTTPS usando .htaccess - atrapado en un bucle de redirección
Mi sitio WordPress está ubicado en example.com/wordpress y necesito que todo su contenido sea accesible únicamente usando SSL.
He creado una regla en .htaccess que redirige http -> https:
RewriteEngine On
RewriteRule ^/?(.*) https://%{SERVER_NAME}/wordpress/directory/$1 [R,L]
Después de implementar esta regla el sitio web es inaccesible ya que está atrapado en un bucle de redirección.
¿Qué estoy haciendo mal?
Mi archivo .htaccess de WordPress:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/directory/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/directory/index.php [L]
</IfModule>

Esta es una respuesta tardía pero esto funciona para mí:
Cambia el RewriteCond a esto:
RewriteCond %{HTTP:X-Forwarded-Proto} !https
Debería quedar así:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://tudominio.com/$1 [R,L]

Esto finalmente funcionó para mí. ¿Alguien puede explicar por qué esta RewriteCond funcionaría cuando RewriteCond %{HTTPS} off
no lo hace?

Sin ser un experto en htaccess, diría que te falta un RewriteCond
- Una condición.
Verifica si está en el puerto 80. Prueba esto:
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^/?(.*) https://%{SERVER_NAME}/wordpress/directory/$1 [R,L]
ACTUALIZACIÓN:
Después de ver tu pregunta actualizada, con el .htaccess completo - Haría esto:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/directory/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/directory/index.php [L]
RewriteCond %{HTTPS} off
RewriteRule ^/?(.*) https://%{SERVER_NAME}/wordpress/directory/$1 [R,L]
</IfModule>
Colocando tu condición y regla debajo de los estándares de WordPress.

Agregarlo a mi archivo .htaccess no ayudó, sigo experimentando el mismo problema de bucle de redirección.

¿Puedes copiar tu archivo htaccess entonces? Públicalo en la pregunta - ¡editaré mi respuesta para otro intento!

Prueba con RewriteCond %{HTTPS} off
en lugar de la condición server_port.

No funcionó y mi archivo .htaccess completo ya está en la pregunta :)

Oh... ¿Dónde están las cosas estándar de Wordpress en el htaccess entonces?

Si nada más funciona, intenta incluir RewriteEngine On
nuevamente, ¡encima de mi respuesta actualizada!

Hmm, tal vez ese sea el problema - no tengo nada más que esto en mi .htaccess

Restauré el .htaccess por defecto, pero el problema aún no se soluciona. Actualicé mi pregunta.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Fuente https://www.godaddy.com/help/redirect-http-to-https-automatically-8828

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
o para una sola página
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} directorio
RewriteRule ^(.*)$ https://www.example.com/directorio/$1 [R,L]
o puedes agregar este código PHP a un archivo específico
if (!isset($_SERVER['HTTPS']) || !$_SERVER['HTTPS']) { // si la solicitud no es segura, redirigir a URL segura
$url = 'https://' . $_SERVER['HTTP_HOST']
. $_SERVER['REQUEST_URI'];
header('Location: ' . $url);
exit;
}
o combinar las reglas de reescritura de WordPress con las de SSL...
RewriteRule ^(.*)$ https://www.example.com/directorio/index\.php[R,L]

Los sitios web detrás de balanceadores de carga o proxies inversos que admiten HTTP_X_FORWARDED_PROTO
pueden solucionarse agregando el siguiente código al archivo wp-config.php
, encima de la llamada require_once:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
$_SERVER['HTTPS'] = 'on';
o usando un plugin
Agrega en la carpeta de plugins de WordPress en tu sitio web, luego actívalo en el administrador de Plugins
<? /* Plugin Name: Establecer cabeceras */
if (stripos(get_option('siteurl'), 'https://') === 0) {
$_SERVER['HTTPS'] = 'on';
// añade detección JavaScript del protocolo de la página, ¡y reza!
add_action('wp_print_scripts', 'force_ssl_url_scheme_script');
}
function force_ssl_url_scheme_script() {
?>
<script>
if (document.location.protocol != "https:") {
document.location = document.URL.replace(/^http:/i, "https:");
}
</script>
<?php
}
Funciona convirtiendo:
http://www.exmaple.com/blog/
ahttps://www.exmaple.com/blog/
http://www.exmaple.com/
ahttps://www.exmaple.com/
