1

mod_rewrite で 2 つのタスクを達成しようとしています。

  1. プロトコルに関係なく、URL に「www」サブドメインがない場合は、URL に「www」を追加します。

  2. 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 にアクセスするとリダイレクト ループが発生します。問題が何であるかを理解できません。これは、一連のイベントを見る方法です。

  1. http://mysite.com/secure.phpが要求されます
  2. ホスト名に「www」が含まれていないため、最初の条件をパスします
  3. URL はhttp://www.mysite.com/secure.phpに更新され、プロセスは先頭に戻ります。
  4. ホスト名には「www」が含まれているため、最初の条件が失敗し、書き換えがスキップされます
  5. HTTPSオフになっているため、次の条件に一致し、かつ
  6. URI は「/secure.php」で始まるため、両方の必須条件に一致します。
  7. URL はhttps://www.mysite.com/secure.phpに更新され、プロセスは先頭に戻ります。
  8. ホスト名には「www」が含まれているため、最初の条件に失敗し、書き換えをスキップします
  9. 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]
4

1 に答える 1

0

HTTP_HOSTまたはのようなサーバー変数REQUEST_URIは で使用できますが、RewriteCondでは使用できませんRewriteRule。これらの変数が必要な場合は、RewriteCond でキャプチャする必要があります

RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} (.+)
RewriteRule .* http://www.%1/$0 [R,L]

RewriteCond でチェックする必要はありませんsecure.php。RewriteRule で指定するだけです。

RewriteCond %{HTTPS} off
RewriteRule ^/?(secure.php.*) https://www.mysite.com/$1 [R,L]

OT:301有効にしてテストしないでください。詳細については、この回答の .htaccess 書き換えルールをデバッグするためのヒントを参照してください。

于 2013-02-20T22:11:37.823 に答える