web-dev-qa-db-ja.com

.htaccessを使用して、1つのパスを除くすべてのURLにSSLを強制します

最初のセグメントが1つを除くすべての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]

それもうまくいきません。私は何が間違っているのですか?

2
Jonathan

あなたはほとんどそれを持っていました。完全な解決策は次のとおりです。

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の一部と見なされるためです。 http:// httpd。のREQUEST_URIの説明を参照してください。 Apache.org/docs/2.4/en/mod/mod_rewrite.html#rewritecond

6