3

これはさらに別の.htaccessの質問です。そして、私はすでに私の文献レビューをしました。助けていただければ幸いです。

要件:

  1. いくつかのURLに対してのみHTTPSを強制します。
  2. ブラウザはSSLページに対して部分的に暗号化されたページを言うべきではありません。

私はCodeIgnitorを使用しており、config.phpのbase_urlをように調整しました。

$config['base_url'] = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on') ? 'https://' : 'http://' ;
$config['base_url'] .= $_SERVER['HTTP_HOST'];
$config['base_url'] .= preg_replace('@/+$@','',dirname($_SERVER['SCRIPT_NAME'])).'/';

したがって、URLがhttps://でアクセスされる場合、それに含まれるすべてのリンクもHTTPS上にあります。これは、「部分的に暗号化されたページ」の問題を回避するためです。

私は次のhtaccessコードから始めました:

RewriteCond %{HTTPS} !on
RewriteRule ^(.*)/(abc|xyz|pqr)(.*)$ https://%{HTTP_HOST}/cart/$2$3 [R=301,NC,L]

RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^(.*)/(abc|xyz|pqr)(.*)$ [NC]
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,NC,L]

これにより、abcxyz、またはpqrを含むURLはHTTPSにリダイレクトされ、それを含まないURLは強制的にHTTPに戻されます。

これはうまく機能しました。これに関する唯一の問題は、「部分的に暗号化されたページ」の問題を回避できないことです。たとえば、URL http://www.example.com/abc/index.phpにアクセスすると、 https ://www.example.com/abc/index.phpにリダイレクトされます。ただし、このページのリンクにはhttps://www.example.com/images/logo.pngと記載されていますが、後者の書き換えルールにより、HTTPに変更されます。これにより、ページが部分的に暗号化されます。

この問題を解決するために、このようなhttp_refererチェックを追加しようとしましたが、明らかに問題は解決しません。HTTPSページからのクリックはHTTPに変換されないためです。

RewriteCond %{HTTPS} !on
RewriteRule ^(.*)/(abc|xyz|pqr)(.*)$ https://%{HTTP_HOST}/cart/$2$3 [R=301,NC,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_REFERER} !^(https)(.*)$
RewriteCond %{REQUEST_URI} !^(.*)/(abc|xyz|pqr)(.*)$ [NC]
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,NC,L]

この単純な問題に利用できるより良いアプローチがあるかどうか、または私がそれを間違った方法で行っているかどうかを知りたいだけです。.htaccessの代わりにCIフックを使用すると、これを解決できますか?

前もって感謝します

4

2 に答える 2

0
于 2009-12-02T09:32:08.607 に答える
0

Okay . I think I found the solution . i tested it too on my server . works fine .. needed a http referer condition too in the rewrite

RewriteCond %{HTTPS} !on
RewriteRule ^(.*)/(abc|xyz|pqr)(.*)$ https://%{HTTP_HOST}/cart/$2$3 [R=301,NC,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_REFERER} !^https(.*)/(abc|xyz|pqr)(.*)$ [NC]
RewriteCond %{REQUEST_URI} !^(.*)/(abc|xyz|pqr)(.*)$ [NC]
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,NC,L]

Now if you visit any of the pages with (abc,xyz,pqr) it will be redirected to https://... also all the embedded link will be served from https . so the browser wont show the partial encryption warning (red warning sign at the status bar)

when you move away from the any of these page, that page will be on ssl because of referer check, and this page might show partially encrypted warning (but i can live with it). Once you move away from this page everything will be non-ssl.

Hope this helps someone !!!

于 2009-12-08T13:01:25.937 に答える