35541
cakephp2.3.5でwebサイトを構築しており、.htaccessの設定で外部からのアクセスは原則httpsで統一したいのですが、一部のURLはhttpアクセスしたいです。

以下のURLをhttpでも許可したい場合、下記コードですとurlを認識せず、httpsリダイレクトされてしまいます。  
<http://example.co.jp/test1/test2?no=1234>

```

    # index.php無しに統一
    RewriteCond %{THE_REQUEST} ^.*/index.(html|htm|php)
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)index.(html|htm|php)$ https://%{HTTP_HOST}/$1 [R=301,L]
    
    RewriteCond %{THE_REQUEST} ^.*/index.(html|htm|php)
    RewriteCond %{HTTPS} on
    RewriteRule ^(.*)index.(html|htm|php)$ https://%{HTTP_HOST}/$1 [R=301,L]
    
    # CakePHP用
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)(#*.*)$ index.php?url=$1$2 [QSA,L]
    
    #################################################################
    # 今回のhttp→httpsを追加
    #################################################################
    RewriteCond %{SERVER_PORT} 80
    RewriteCond %{REQUEST_URI} !(^/test1/)
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    
```

.htaccessはproject/app/webroot/.htaccessを編集しております。

正規表現がよろしくないのでしょうか？  
または他の設定の影響など。

また、.htaccessのデバッグを出せるようにしたのですが、RewriteCond %{REQUEST_URI}
!(^/test1/)の判定など通常出ているのでしょうか？いまいちログを追えていない状態です。

参考サイト  
<http://qiita.com/gotohiro55/items/7daa988db23a5a8355c1>  
<https://kana-lier.com/web/redirect/>  
<http://d.hatena.ne.jp/shimonoakio/20080226/1204089340>
CC BY-SA 3.0
2017-06-12T12:50:06.377
35509
2017-06-13T09:39:49.637
2017-06-13T01:14:43.073
15167
15167
question
php cakephp apache .htaccess
.htaccessで原則httpはhttpsにリダイレクトですが、一部のURLは除いてhttpアクセスできるようにしたいです。
`/test1/`以下のURIを対象外にするのであれば、RewriteCondの2行目はこうではないでしょうか?  
(質問の記載だと、URIが`/test1/`の場合のみ対象外になるように見えます)

```

        RewriteCond %{REQUEST_URI} !(^/test1/.*$)
    
```

ちなみに、`http`アクセスを表すのであれば、ポート番号よりも、参考サイト(
<http://qiita.com/gotohiro55/items/7daa988db23a5a8355c1>
)にあるように、`%{HTTPS}`で判定した方が厳密かと思います。

```

        RewriteCond %{HTTPS} off
    
```
CC BY-SA 3.0
2017-06-12T13:23:08.183
35511
2017-06-12T13:23:08.183
20098
35509
answer
設定は合っていると思います。  
デバッグログを出すには、httpd.conf に下記例のように設定ください。

```

    (httpd-2.2)
      RewriteLog /var/log/httpd/rewrite.log
      RewriteLogLevel 4
      # 0 - 9
    
    (httpd-2.4)
      LogLevel warn rewrite:trace4
      # trace1 - trace8, error_log に出力される
    
```
CC BY-SA 3.0
2017-06-12T16:28:00.810
35515
2017-06-12T16:28:00.810
4603
35509
answer
合ってそうに見えますね。  
当てずっぽうで書くと `^` を括弧で挟むのは 違和感があるので次のようにすると動作変わったりしませんか？

```

    RewriteCond %{REQUEST_URI} !^(/test1/)
    
```

もしくは

```

    RewriteCond %{REQUEST_URI} !^/test1/
    
```
CC BY-SA 3.0
2017-06-13T04:52:25.493
35531
2017-06-13T04:52:25.493
5008
35509
answer
単純に記述順が間違っています。

各RewriteRuleには `L` フラグがついているため、条件にマッチした場合そこで書換を終了します。

RewriteRule Flags - Apache HTTP Server Version 2.4
<http://httpd.apache.org/docs/current/rewrite/flags.html#flag_l>

つまり、例示の.htaccessでは、ファイル／ディレクトリが存在しない場合はCakePHPのルールに該当するため、以降のルールは無視されることになります。

順序を変えて以下のようにするとよいでしょう。

```

    # index.php無しに統一
    RewriteCond %{REQUEST_URI} /index\.(html|htm|php)$
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)index.(html|htm|php)$ https://%{HTTP_HOST}/$1 [R=301,L]
    
    RewriteCond %{REQUEST_URI} /index\.(html|htm|php)$
    RewriteCond %{HTTPS} on
    RewriteRule ^(.*)index.(html|htm|php)$ https://%{HTTP_HOST}/$1 [R=301,L]
    
    #################################################################
    # 今回のhttp→httpsを追加
    #################################################################
    RewriteCond %{HTTPS} off
    RewriteCond %{REQUEST_URI} !(^/test1/)
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    
    # CakePHP用
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)(#*.*)$ index.php?url=$1$2 [QSA,L]
    
```
CC BY-SA 3.0
2017-06-13T09:39:49.637
35541
2017-06-13T09:39:49.637
2668
35509
answer