1

我正在尝试使用 mod_rewrite 完成 2 个任务:

  1. 如果 URL(无论协议如何)都没有“www”子域,则将“www”添加到 URL。

  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没有关闭,因此它不符合下一个条件并跳过重写。

我说对了吗?我在这里做错了什么?

我在 .htaccess 中还有另一条规则,用于从 ExpressionEngine URL 中删除 index.php:

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在 a 中可用RewriteCond,但在 a 中不可用RewriteRule。如果您需要这些变量,则必须在 RewriteCond 中捕获它们

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

你不需要secure.php在 RewriteCond 中检查,你可以在 RewriteRule 中指定它

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

OT:永远不要在301启用的情况下进行测试,有关详细信息,请参见调试 .htaccess 重写规则的提示。

于 2013-02-20T22:11:37.823 回答