最初のセグメントが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]
それもうまくいきません。私は何が間違っているのですか?
あなたはほとんどそれを持っていました。完全な解決策は次のとおりです。
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