Forzare HTTPS usando .htaccess - bloccato in un loop di reindirizzamento
Il mio sito WordPress si trova su example.com/wordpress e ho bisogno che tutto il contenuto sia accessibile solo tramite SSL.
Ho creato una regola .htaccess che reindirizza da http a https:
RewriteEngine On
RewriteRule ^/?(.*) https://%{SERVER_NAME}/wordpress/directory/$1 [R,L]
Dopo aver implementato questa regola il sito web non è accessibile poiché è bloccato in un loop di reindirizzamento.
Cosa sto sbagliando?
Il mio .htaccess di 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>

Questa è una risposta tardiva ma funziona per me:
Modifica il RewriteCond in questo modo
RewriteCond %{HTTP:X-Forwarded-Proto} !https
Dovrebbe essere così:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://tudominio.com/$1 [R,L]

Alla fine ha funzionato per me. Qualcuno può spiegare perché questa RewriteCond funziona quando RewriteCond %{HTTPS} off
non funziona?

Anche senza essere un esperto di htaccess, direi che ti manca una RewriteCond
- Una condizione.
Verifica se è sulla porta 80. Prova questo:
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^/?(.*) https://%{SERVER_NAME}/wordpress/directory/$1 [R,L]
AGGIORNAMENTO:
Dopo aver visto la tua domanda aggiornata, con l'htaccess completo - farei così:
<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>
Posizionando la tua condizione e regola sotto gli standard di Wordpress.

Aggiungerlo al mio .htaccess non ha aiutato, sto riscontrando lo stesso problema di loop di reindirizzamento.

Puoi copiare il tuo file htaccess allora? Inseriscilo nella domanda - modificherò la mia risposta per un altro tentativo!

Prova RewriteCond %{HTTPS} off
invece della condizione server_port.

Non ha funzionato e il mio intero file .htaccess è già nella domanda :)

Se non altro - Prova a includere di nuovo RewriteEngine On
, sopra la mia risposta aggiornata!

Hmm, forse è quello il problema - non ho nient'altro che questo nel mio .htaccess

Ho ripristinato il .htaccess predefinito, ma il problema non è ancora risolto. Ho aggiornato la mia domanda.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Fonte 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]
oppure per una singola pagina
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} directory
RewriteRule ^(.*)$ https://www.example.com/directory/$1 [R,L]
in alternativa puoi aggiungere questo codice PHP a un file specifico
if (!isset($_SERVER['HTTPS']) || !$_SERVER['HTTPS']) { // se la richiesta non è sicura, reindirizza all'URL sicuro
$url = 'https://' . $_SERVER['HTTP_HOST']
. $_SERVER['REQUEST_URI'];
header('Location: ' . $url);
exit;
}
oppure combina le regole di riscrittura di WordPress con quelle per SSL
RewriteRule ^(.*)$ https://www.example.com/directory/index\.php[R,L]

I siti web dietro bilanciatori di carico o proxy inversi che supportano HTTP_X_FORWARDED_PROTO
possono essere sistemati aggiungendo il seguente codice al file wp-config.php
, sopra la chiamata require_once:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
$_SERVER['HTTPS'] = 'on';
oppure utilizzando un plugin
Aggiungi nella cartella dei plugin WordPress sul tuo sito, quindi attivalo nella sezione Plugin di amministrazione
<? /* Plugin Name: Imposta header */
if (stripos(get_option('siteurl'), 'https://') === 0) {
$_SERVER['HTTPS'] = 'on';
// aggiunge rilevamento JavaScript del protocollo della pagina, e spera!
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
}
Funziona convertendo
http://www.exmaple.com/blog/
inhttps://www.exmaple.com/blog/
http://www.exmaple.com/
inhttps://www.exmaple.com/
