J'utilise Codeigniter et suis ces instructions pour forcer SSL mais toutes les demandes sont redirigées
http://staging.example.com/index.php/https:/staging.example.com
Mon .htaccess
est:
### Canonicalize codeigniter URLs
# Enforce SSL https://www.
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
###
# Removes access to the system folder by users.
# Additionally this will allow you to create a System.php controller,
# previously this would not have been possible.
# 'system' can be replaced if you have renamed your system folder.
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php/$1 [L]
# Checks to see if the user is attempting to access a valid file,
# such as an image or css document, if this isn't true it sends the
# request to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
Je pense, au lieu de
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
vous devriez avoir quelque chose comme
RewriteRule ^.*$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
faire correspondre la règle de réécriture. Votre lien est actuellement produit par la troisième règle.
Vous pouvez le faire en code au lieu d'utiliser htaccess.
Vous pouvez créer une fonction d'assistance redirigeant la page via SSL, que vous appelez depuis votre contrôleur.
Dans votre aide
function force_ssl() {
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") {
$url = "https://". $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
redirect($url);
exit;
}
}
Puis dans votre contrôleur;
class Whatever extends CI_Controller {
function __construct() {
parent::__construct();
$this->load->helper(array('your_ssl_helper'));
}
public function index() {
force_ssl();
...
}
}
Utilisez ceci
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R=301,L]
au lieu de
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
J'ai écrit la classe suivante à cet effet. Je préfère avoir ce genre de choses dans le code plutôt que dans un fichier de configuration, de sorte que le comportement ne puisse pas être modifié par une mauvaise configuration (c'est-à-dire qu'une page est vraiment "forcée" à SSL).
La fonction doit être appelée à un stade précoce du processus de chargement de votre site.
class SecurityHelper extends MX_Controller
{
// CONTROLLERS FORCED TO SSL
private $arrHttps = array(
'products/shipping',
'products/billing'
);
// CONTROLLERS ACCESSIBLE FROM BOTH
private $arrAgnostic = array (
'products/getcart'
);
function redirectSsl()
{
// SSL MODULES
if(in_array(uri_string(), $this->arrHttps))
{
// ONLY REDIRECT IF NECESSARY
if ($_SERVER['HTTPS'] != "on")
{
// REDIRECTING TO SSL
$newUrl = str_replace('http://', 'https://', base_url($_SERVER['REQUEST_URI']));
redirect($newUrl);
}
}
// NON-SSL MODULES
else
{
// IF AGNOSTIC, DON'T REDIRECT
if(in_array(uri_string(), $this->arrAgnostic))
return;
// ONLY REDIRECT IF NECESSARY
if ($_SERVER['HTTPS'] == "on")
{
$newUrl = str_replace('https://', 'http://', base_url($_SERVER['REQUEST_URI']));
redirect($newUrl);
}
}
}
}
J'espère que ça aide.
Vraisemblablement, vous avez RewriteEngine On
quelque part au-dessus de ce code ...
RewriteCond %{REQUEST_URI} ^system.*
ne va probablement pas se déclencher. REQUEST_URI doit commencer par/(contrairement à RewriteRule), vous voulez donc probablement
RewriteCond %{REQUEST_URI} ^/system
Je ne suis pas sûr que
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
correspondra de manière fiable, avec ^. Je voudrais essayer ce qui suit:
RewriteRule ^(.*)$ https://%{HTTP_Host}$1 [L,R=301]
Incidemment, HTTP_Host est normalement ce que le visiteur a tapé, donc www. n'est pas garanti, si c'est ce que vous voulez. Vous aurez besoin d'une étape distincte pour forcer www ..