web-dev-qa-db-ja.com

特定のURLでHTTPSを強制し、他のすべてのURLでHTTPを強制する

特定のフォルダーにHTTPSを強制し、他のすべてのフォルダーにHTTPを強制する必要があるクライアントプロジェクトがあります。希望するフォルダーにHTTPSを強制的に適用できますが、サイトの残りの部分へのすべてのリンクはHTTPS経由になります。安全なフォルダに「ない」ものに対する要求を強制的にHTTPに戻すルールを作成したいと思います。ここに私が持っているものがあります:

RewriteEngine On
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]

RewriteCond %{HTTPS} !=on
RewriteRule ^(my) https://%{HTTP_Host}%{REQUEST_URI} [NC,R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1

「my」は、HTTPSを強制する必要があるフォルダーの名前です。

何か案は?

更新:私も試しました:

RewriteEngine On
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]

# Force HTTPS for /my
RewriteCond %{HTTPS} !=on
RewriteRule ^(my) https://%{HTTP_Host}%{REQUEST_URI} [NC,R=301,L]

# Force HTTP for anything which isn't /my
RewriteCond %{HTTPS} =on
RewriteRule !^my http://%{HTTP_Host}%{REQUEST_URI} [NC,R=301,L]

# Remove index.php from URLs
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1

ただし、/ myに対するリクエストがHTTPSを介して強制されるのではなく、 http://www.example.com/index.php/my に解決されます。

:?

18
Nathan Pitman

ああ、もちろん。問題は、最初のリダイレクト後にindex.phpに変換された後、書き換えルールセットが再処理されるという事実にあります。現在持っているものを使用して、/index.php/myへの書き換え後にリダイレクトが適用されないように、リダイレクトをさらに調整する必要があります。

次のようなことができます:

RewriteEngine On
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]

# Force HTTPS for /my
RewriteCond %{HTTPS} !=on
RewriteCond %{THE_REQUEST} ^[A-Z]+\s/my [NC]
RewriteRule ^(my) https://%{HTTP_Host}%{REQUEST_URI} [NC,R=301,L]

# Force HTTP for anything which isn't /my
RewriteCond %{HTTPS} =on
RewriteCond %{THE_REQUEST} !^[A-Z]+\s/my [NC]
RewriteRule !^my http://%{HTTP_Host}%{REQUEST_URI} [NC,R=301,L]

# Remove index.php from URLs
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1
16
Tim Stone

以下を試してください、あなたのために働くはずです:

RewriteEngine On

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/my
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/my
RewriteRule ^(.*)$ http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
4
user2316701

これは古いクライアントWebサイトから機能するもので、目的に合わせて調整できます。

#If https off and in the cart dir
RewriteCond %{HTTPS} =off [NC]
RewriteCond %{REQUEST_URI} ^/cart/(.*) [NC]
RewriteRule ^(.*)$ https://%{HTTP_Host}/cart/%1 [R=301,L]

#If https on and not in cart dir    
RewriteCond %{HTTPS} =on
RewriteCond %{REQUEST_URI} !^/cart [NC]
#Above line actually used to read RewriteCond %{REQUEST_URI} !^/cart|media|images|thumbs|css|js [NC]
#to allow js/css/images to be served so there were no mixed ssl messages popping up to visitors
RewriteCond %{REQUEST_FILENAME} !index\.php$ [NC]
RewriteRule ^(.*)$ http://%{HTTP_Host}/$1 [R=301,L]

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

おそらくカートをカートに置き換える

1
connrs

条件を逆にするだけです:

RewriteCond %{HTTPS} =on
RewriteRule !^my http://%{HTTP_Host}%{REQUEST_URI} [NC,R=301,L]
0
Gumbo