Codeigniterを使用して これらの手順 に従ってsslを強制していますが、すべてのリクエストがリダイレクトされています
http://staging.example.com/index.php/https:/staging.example.com
ぼくの .htaccess
は:
### 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]
代わりに
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
あなたは何かのようにすべきです
RewriteRule ^.*$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
書き換えルールが一致している。現在、リンクは3番目のルールによって作成されています。
Htaccessを使用する代わりに、コードでそれを行うことができます。
コントローラーから呼び出すSSLを介してページにリダイレクトするヘルパー関数を作成できます。
あなたのヘルパーで;
function force_ssl() {
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") {
$url = "https://". $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
redirect($url);
exit;
}
}
次に、コントローラーで。
class Whatever extends CI_Controller {
function __construct() {
parent::__construct();
$this->load->helper(array('your_ssl_helper'));
}
public function index() {
force_ssl();
...
}
}
これを使用
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R=301,L]
の代わりに
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
私はこの目的のために次のクラスを書きました。設定ファイルよりもコードにこのようなものを含めることをお勧めします。これにより、不適切な設定(つまり、ページが本当にSSLに強制される)によって動作を変更できないようになります。
この関数は、サイトの読み込みプロセスの早い段階で呼び出す必要があります。
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);
}
}
}
}
それが役に立てば幸い。
おそらくあなたはRewriteEngine On
このコードのどこか...
RewriteCond %{REQUEST_URI} ^system.*
おそらくトリガーされません。 REQUEST_URIは/で始まる必要があります(RewriteRuleとは異なります)。
RewriteCond %{REQUEST_URI} ^/system
わからない
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
^と確実に一致します。私は以下を試します:
RewriteRule ^(.*)$ https://%{HTTP_Host}$1 [L,R=301]
ちなみに、HTTP_Hostは通常、訪問者が入力したものなので、wwwです。それがあなたが望むものであるならば、それは保証されません。 www ..を強制するには、別の手順が必要になります。