htaccess (https to http) - PullRequest
       31

htaccess (https to http)

3 голосов
/ 30 ноября 2009

это еще один вопрос .htaccess. И я уже сделал свой обзор литературы. Буду признателен за любую помощь.

Требования:

  1. Принудительно использовать HTTPS только для нескольких URL.
  2. Браузер не должен говорить частично зашифрованная страница для страниц SSL.

Я использую CodeIgnitor и настроил base_url в config.php для:

$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]

При этом любой URL, имеющий abc , xyz или pqr , будет перенаправлен на 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]

Просто хочу узнать, есть ли лучший подход к этой простой проблеме или я делаю это неправильно. Решит ли это использование хуков CI вместо .htaccess?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 08 декабря 2009

Хорошо. Я думаю, что нашел решение. я тоже проверил это на моем сервере. работает отлично .. нужно было условие http referer в перезаписи

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]

Теперь, если вы зайдете на любую из страниц с помощью (abc, xyz, pqr), она будет перенаправлена ​​на https: // ... также все встроенные ссылки будут обслуживаться с https. поэтому браузер не будет показывать предупреждение о частичном шифровании (красный предупреждающий знак в строке состояния)

когда вы отойдете от любой из этих страниц, эта страница будет на ssl из-за проверки реферера, и на этой странице может отображаться частично зашифрованное предупреждение (но я могу жить с этим). После того, как вы уйдете с этой страницы, все будет не так.

Надеюсь, это кому-нибудь поможет !!!

0 голосов
/ 02 декабря 2009

Вы можете поместить свое статическое содержимое в другой домен, например static.example.com и отключить перенаправление HTTPS на HTTP для таких запросов.

Используйте //static.example.com/…, чтобы указать, что ресурсы используют ту же схему URI, что и документ, в котором содержится ссылка, и проверьте в вашем RewriteRule, запрашивается ли такой ресурс:

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