Назад | Перейти на главную страницу

Принудительно использовать SSL для каждого URL, кроме одного пути, используя .htaccess

Я пытаюсь применить SSL для всех URL, кроме одного с первым сегментом /preview.

http://test.example.com/preview/blah/blah

должно игнорироваться правилом; все остальные URL-адреса должны использовать SSL. Я использую CentOS 6.4, Apache и CodeIgniter.

Мой файл .htaccess:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} !^/preview/
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]

Обычно URL-адреса CI выглядят так, прежде чем они будут перезаписаны последним правилом:

http://test.example.com/index.php?/preview/blah/blah

Я пробовал:

RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} !^/index.php?/preview/
RewriteCond %{REQUEST_URI} !^/preview/
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Это тоже не работает. Что я делаю не так?

Вы почти получили это. Полное решение:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} !^/preview
RewriteCond %{QUERY_STRING} !^/preview
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]

Причина неудачи заключалась в том, что http://test.domain.com/preview/blah/blah сначала решается на http://test.domain.com/index.php?/preview/blah/blah и что этот URL немедленно перезаписывается снова (htaccess зацикливается с новым URL).

Новый URL (http://test.domain.com/index.php?/preview/blah/blah не соответствовали вашим условиям, потому что часть после? считается частью не REQUEST_URI, а QUERY_STRING. См. Описание REQUEST_URI на http://httpd.apache.org/docs/2.4/en/mod/mod_rewrite.html#rewritecond