mod_rewrite で 2 つのタスクを達成しようとしています。
プロトコルに関係なく、URL に「www」サブドメインがない場合は、URL に「www」を追加します。
URI が /secure.php で始まり、プロトコルが https でない場合は、プロトコルを https に切り替えます。
だから私は試しました:
# Redirect to www subdomain
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
# Force SSL for secure.php URIs
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/secure.php
RewriteRule ^(.*)$ https://www.mysite.com%{REQUEST_URI} [R=301,L]
しかし、/secure.php URI にアクセスするとリダイレクト ループが発生します。問題が何であるかを理解できません。これは、一連のイベントを見る方法です。
- http://mysite.com/secure.phpが要求されます
- ホスト名に「www」が含まれていないため、最初の条件をパスします
- URL はhttp://www.mysite.com/secure.phpに更新され、プロセスは先頭に戻ります。
- ホスト名には「www」が含まれているため、最初の条件が失敗し、書き換えがスキップされます。
- HTTPSがオフになっているため、次の条件に一致し、かつ
- URI は「/secure.php」で始まるため、両方の必須条件に一致します。
- URL はhttps://www.mysite.com/secure.phpに更新され、プロセスは先頭に戻ります。
- ホスト名には「www」が含まれているため、最初の条件に失敗し、書き換えをスキップします。
- HTTPSはオフになっていないため、次の条件で失敗し、書き換えをスキップします。
私はそれを正しく理解していますか?ここで何が間違っていますか?
ExpressionEngine の URL から index.php を削除するために、.htaccess にもう 1 つのルールがあります。
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
.htaccess ファイル全体は次のとおりです。
RewriteEngine On
RewriteBase /
# Remove index.php from ExpressionEngine URIs
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
# Redirect to www subdomain
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
# Force SSL for /secure.php URIs
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/secure.php
RewriteRule ^(.*)$ https://www.mysite.com%{REQUEST_URI} [R=301,L]