Comment puis-je avoir CodeIgniter charger des pages spécifiques en utilisant SSL? J'ai un serveur Apache2/mode_ssl
. mod_ssl
utilise une racine de document différente de celle des pages non sécurisées. Par exemple, https (port 443) servirait des pages sur /var/www/ssl_html/
et http (port 80) servirait des pages sur /var/www/html/
. Comment pourrais-je obtenir CodeIgniter pour jouer à Nice avec cette configuration?
Il y a peu de moyens de s'y attaquer.
Option 1:
Le code devrait probablement être déployé dans les deux dossiers, puis dans le fichier: /system/application/config/config.php, définissez votre page sur:
$config['base_url'] = "http://www.yoursite.com/";
ou
$config['base_url'] = "https://www.yoursite.com/";
Ensuite, dans votre dossier VirtualHost non ssl, configurez votre configuration pour rediriger les pages protégées par dossier vers le site SSL:
RedirectPermanent /sslfolder https://www.yoursite.com/sslfolder
Option 2:
Envoyez tout à SSL et conservez tout votre code dans un seul dossier
/system/application/config/config.php, configurez votre page pour:
$config['base_url'] = "https://www.yoursite.com/";
Autres options
Il existe d'autres moyens plus astucieux de faire cela avec les redirections header (), etc., mais je ne pense pas que vous souhaitiez conserver différentes bases de code pour cette option. Je ne le recommande pas, mais vous pourriez faire quelque chose comme:
$config['base_url'] = “http://” . $_SERVER['http_Host'] . “/”;
Dans application/config/config.php, définissez base_url sur:
$config['base_url'] = ($_SERVER['SERVER_PORT'] == 443 ? 'https' : 'http') . "://{$_SERVER['HTTP_Host']}/";
Cela lui permettra de fonctionner sur n'importe quel domaine, ce qui est pratique si vous testez localement.
J'ai mis les lignes suivantes dans le fichier ./application/config/config.php et cela fonctionne parfaitement:
$protocol = ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ) ? 'https' : 'http';
$config['base_url'] = $protocol.'://www.yoursite.com';
Je voudrais maintenir deux ensembles de code et gérer une redirection forcée vers des pages HTTPS avec un hook post_controller_constructor. Le hook sera appelé avant le rendu de chaque page pour vérifier si le visiteur doit être redirigé vers HTTPS en fonction de son emplacement actuel sur votre site.
ÉTAPE 1
Créer un fichier: system/application/hooks/SecureAccount.php
<?php
class SecureAccount
{
var $obj;
//--------------------------------------------------
//SecureAccount constructor
function SecureAccount()
{
$this->obj =& get_instance();
}
//--------------------------------------------------
//Redirect to https if in the account area without it
function index()
{
if(empty($_SERVER["HTTPS"]) || $_SERVER["HTTPS"] !== 'on')
{
$this->obj =& get_instance();
$this->obj->load->helper(array('url', 'http'));
$current = current_url();
$current = parse_url($current);
if((stripos($current['path'], "/account/") !== false))
{
$current['scheme'] = 'https';
redirect(http_build_url('', $current), 'refresh');
}
}
}
}
?>
ÉTAPE 2
Personnalisez le chemin dans la fonction pour laquelle les zones de votre site doivent être contraintes d'utiliser HTTPS.
ÉTAPE 3
Ajoutez les éléments suivants à system/application/config/hooks.php
/* Force HTTPS for account area */
$hook['post_controller_constructor'] = array(
'class' => 'SecureAccount',
'function' => 'index',
'filename' => 'SecureAccount.php',
'filepath' => 'hooks',
'params' => array()
);
Je peux facilement, je ne définis que:
$config['base_url'] = '';
CI obtenir automatiquement base_url = D
la solution qui m'est venue à l'esprit est d'utiliser str_replace () comme si
$base_url_str = base_url();
$secure_base_url = str_replace("http","https",$base_url_str );
chaque fois que j'ai besoin d'un emplacement sécurisé, j'utilise $ secure_base_url au lieu de base_url (), , alors disons que votre base_url () est http://www.example.com alors $ secure_base_url sera https://www.example.com
J'ai résolu le problème avec in config.php
$config['ssl_active'] = false;
if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) {
$config['ssl_active'] = true;
}
$config['base_url'] = ($config['ssl_active'] === true )?"https":"http" . $_SERVER['HTTP_Host'];
Le problème d'annuaire, vous pouvez utiliser un simple lien simbolique ln -s
C'est ce qui a fonctionné pour moi. Notre serveur possède tous les deux $ _SERVER ['SERVER_PORT'] et $ _SERVER ['HTTP_X_FORWARDED_PORT']
Nous devrions vérifier d’abord si $ _SERVER ['HTTP_X_FORWARDED_PORT'] est disponible et l’utiliser au lieu de $ _SERVER ['SERVER_PORT']
$config['base_url'] =
( ( ( empty($_SERVER['HTTP_X_FORWARDED_PORT']) ? $_SERVER['SERVER_PORT'] : $_SERVER['HTTP_X_FORWARDED_PORT'] ) == 443 ? 'https' : 'http') . "://" . $_SERVER['HTTP_Host'] )
. str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']) ;
testé cela sur notre serveur linux ...
en fait, c'est basé sur la réponse de Skyler avant qui était.
$config['base_url'] = ($_SERVER['SERVER_PORT'] == 443 ? 'https' : 'http') . "://{$_SERVER['HTTP_Host']}/";
autre question est semblable à ceci
vous pouvez utiliser une URL relative au protocole qui conservera la persistance dans la liaison dans CI.
dans votre config.php
au lieu de:
$config['base_url'] = 'http://example.com/';
mettre;
$config['base_url'] = '//example.com/';
informations sur les liens relatifs au protocole ici .