Вопрос

это еще один вопрос по .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-адрес, имеющий абв, xyz или пкр будет перенаправлен на 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

Хорошо .Думаю, я нашел решение.я тоже тестировал это на своем сервере.работает отлично ..при перезаписи также требовалось условие 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(.*)/(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 из-за проверки реферера, и на этой странице может отображаться частично зашифрованное предупреждение (но я могу с этим смириться).Как только вы уйдете с этой страницы, все будет без SSL.

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

Другие советы

Вы можете разместить свое статическое содержимое в другом домене, например 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]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top