使用 .htaccess 强制对除一个路径之外的每个 URL 进行 SSL

使用 .htaccess 强制对除一个路径之外的每个 URL 进行 SSL

我正在尝试对除第一段之外的每个 URL 强制实施 SSL /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]

通常,CI URL 在被最后一条规则重写之前看起来像这样:

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]

那也不起作用。我做错了什么?

答案1

您几乎已经搞定了。完整的解决方案是:

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

相关内容