我正在尝试使用 mod_rewrite 完成 2 个任务:
如果 URL(无论协议如何)都没有“www”子域,则将“www”添加到 URL。
如果 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没有关闭,因此它不符合下一个条件并跳过重写。
我说对了吗?我在这里做错了什么?
我在 .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]