这是另一个 .htaccess 问题。我已经做了文献综述。将不胜感激任何帮助。
要求:
- 仅对少数 URL 强制使用 HTTPS。
- 浏览器不应该说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'])).'/';
因此,如果使用https://访问 URL,则其中包含的所有链接也将在 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]
这样,任何具有abc、xyz或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]
只是想知道对于这个简单的问题是否有更好的方法,或者我做错了。使用 CI 钩子而不是 .htaccess 会解决这个问题吗?
提前致谢