2017-09-20 2 views
3

私はすべてのWebサイトをhttpsに強制しようとします。だから私はした:1つのURLを除いてHtaccess force httpsが機能しない

RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* index.php 

RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} ="" 
RewriteCond %{HTTPS} !=on 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302] 

それは動作します。問題は、私がmywebsite.com/api/http://homewebsite.com/api/でhttp呼び出しをしたいということです。だから私はRewriteCond %{REQUEST_URI} !^/api(/.*)?を追加します。

RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* index.php 

RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} ="" 
RewriteCond %{HTTPS} !=on 
RewriteCond %{REQUEST_URI} !^/api(/.*)? 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302] 

しかし、それは動作しません:

私の.htaccessです。私はhttp://mywebsite.com/api/xxxに電話するとhttps://mywebsite.com/index.phpにリダイレクトされます。

私はなぜそれがわかりません。あなたはなにか考えはありますか?
私はZendの1

---- EDIT ----

はこれに私の.htaccessを変更使用:

RewriteEngine On 

# HTTPS 
RewriteCond %{HTTPS} !=on 
RewriteCond %{REQUEST_URI} !^/api(/.*)? 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302] 

RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* index.php 

Options +Indexes 
IndexIgnore * 

しかし、まだ

---動作しませんが - EDIT 2 ----

新しい.htaccess(これは動作しています)

私は QUERY_STRINGに条件を追加し、 index.php

にリダイレクト最後に変更しなければならなかった

RewriteEngine On 
RewriteBase/

# HTTPS 
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} ="" 
RewriteCond %{HTTPS} !=on 
RewriteCond %{REQUEST_URI} !^/api 
RewriteCond %{QUERY_STRING} !^/api 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

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

あなたはあなたが間違った順序でディレクティブを持って

+0

プロキシサーバーの背後にいますか? – MrWhite

+0

@MrWhiteノップ、プロキシの背後にない – RichardLenoir

答えて

4

を@MrWhiteありがとうございました。正規のHTTPからHTTPSへのリダイレクトは、内部リライト(つまり、フロントコントローラ)の前に来る必要があります。それ以外の場合、/api/<something>のリクエストは/index.phpに内部的に書き換えられます(/api/<something>は実際のファイルとして存在しないと仮定しているため)。 /index.phpは、/api/<something>を確認しているRewriteCond指令と一致しません。したがってからhttps://example.com/index.phpにリダイレクトされます(あなたの例ではhttpを指定しましたか?)。プロキシの背後

ない

あなたは、あなたがこれらのみプロキシサーバによって設定されている(X-Forwarded-Proto HTTPリクエストヘッダをチェックする条件を削除する必要がありますプロキシサーバーの背後にいない場合、および場合あなたはプロキシサーバの背後にいないので、クライアントはこのヘッダを悪意を持って設定し、あなたのリダイレクトを避けることができます)。

この2行:

RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} ="" 

UPDATE:あなたが上記の条件を削除した後にリダイレクトループを取得した場合、それはあなたが後にすべてのSSLプロキシの背後にあるということであるかもしれません(アプリケーションに見られるHTTP要求ヘッダーを調べることで知ることができます。実際にはサーバーの設定にアクセスする必要はありません。実際には、サーバーの設定を見て知ることができない場合があります)。

は(SSLプロキシの背後にある場合は、その後HTTPSは常にoffある - アプリケーションがクライアントに戻って暗号化されたHTTPS応答を提供していますSSLプロキシへのHTTPレスポンスを提供しています。)

は、以下のことを試してみてください。

Options +Indexes 
IndexIgnore * 

RewriteEngine On 
RewriteBase/

# HTTP to HTTPS, except for the api subdirectory 
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} ="" 
RewriteCond %{HTTPS} !=on 
RewriteRule !^api https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302] 

# Front controller 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* index.php [L] 

これは、wwwとnon-wwwとの間には共通点がありません。関係なく、あなたのコードの

+0

ありがとうございます。注文を変更しようとしましたが、以前はHTTPSをHTTPSにリダイレクトしていましたが、まだ問題は残ります。 – RichardLenoir

+0

ブラウザのキャッシュをクリアしてください。あなたが見ているリダイレクトは、ディレクティブが他の方法であることを強く示唆しています。 – MrWhite

+0

私の.htaccessを 'RewriteCond%{HTTP} =に編集しました RewriteCond%{REQUEST_URI}!^/api(/.*)?あなたが 'RewriteCond%{HTTPS} 'を変更したのはなぜですか? – RichardLenoir

1

、あなたのメインディレクトリ.htaccessファイルでのみ、次のコードを配置:

RewriteEngine On 
RewriteCond %{HTTPS} !=on 
RewriteCond %{THE_REQUEST} !\s/+api/ [NC] 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R] 

これは、あなたがhttphttpとyourwebsite/APIを要求した場合、その後httpsするapi/以外のすべての要求を強制します、 wwwまたはwwwがない場合は、api/ディレクトリに移動することになります。api/の場合はhttpsとなりますが、wwwの場合は上記の規則は適用されません。httpsこの条件のためにRewriteCond %{HTTPS} !=onですので、このルールが無効になります。なぜhttp://yourwebsite/apihttps://yourwebsite/apiが動作するのですか

+0

しかし、OPはおそらくSSLプロキシの背後にあるようです(したがって、HTTPSではなくHTTP:X-Forwarded-Protoをチェックする必要があります)。 OPが何か似たようなことを試みたとき、彼らはリダイレクトループを持っていました(他の答えのコメントを見てください)。 – MrWhite

+0

最後に、あなたは正しいですが、彼に最初に尋ねたとき、彼はいいえと答えました –

関連する問題