在我的网站上,我有一个页面以 iframe 形式加载其他来源的内容,因此无法建立 http 连接。我安装了 SSL,并在所有 URL 上强制使用站点范围的 https。我正在运行 Symfony 1.4 应用程序,各个级别的重写和重定向如下:
虚拟主机设置:
<VirtualHost *:80>
ServerName myserver.com
ServerAlias www.myserver.com
Redirect permanent / https://myserver.com/
</VirtualHost>
<VirtualHost *:443>
ServerName myserver.com
ServerAlias www.myserver.com
SSLEngine on
SSLCertificateFile /path/to/ssl/myserver.crt
SSLCertificateKeyFile /path/to/ssl/myserver.key
SSLCertificateChainFile /path/to/ssl/cert.ca-bundle
DocumentRoot /var/www/myserver/web
DirectoryIndex index.php
<Directory /var/www/myserver>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Require all granted
</Directory>
<Directory "/var/www/myserver/web/images">
LimitRequestBody 2147483647
</Directory>
</VirtualHost>
.htaccess 文件:
Options +FollowSymLinks +ExecCGI
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTPHOST}%{REQUESTURI}
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
我希望只有此页面 /link-view/ 应位于 http 上。我尝试通过添加以下行来修改 .htaccess:
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI}
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$ [NC]
RewriteRule ^(.*)$ https://%2/$1 [R=301,L,QSA]
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} link-view
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$ [NC]
RewriteRule ^(.*)$ http://www.%2/$1 [R=301,L,QSA]
但它不起作用,页面上显示“重定向过多”。我该如何实现?
答案1
我相信这样就可以了。您已经创建了一个循环,这就是过多重定向的含义。在这里,您关闭了 https 的情况,而不是页面链接视图,然后将其重定向到 https。第二个现在可以自由地仅对链接视图起作用。此外,您想明确说明路径,URI 是 yoursite.com/link-view 吗?如果是这样,您应该明确说明。!表示不是。^ 表示以...开头。您正在使用 rewritebase /,因此您不需要以 / 开头
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^link-view
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$ [NC]
RewriteRule ^(.*)$ https://%2/$1 [R=301,L,QSA]
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} ^link-view
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$ [NC]
RewriteRule ^(.*)$ http://www.%2/$1 [R=301,L,QSA]
有时只需按照您的 URL 思考一下就会很有帮助:
# rule 1
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI}
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$ [NC]
RewriteRule ^(.*)$ https://%2/$1 [R=301,L,QSA]
# rule 2
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} link-view
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$ [NC]
RewriteRule ^(.*)$ http://www.%2/$1 [R=301,L,QSA]
您的第一条规则将所有 http 重定向到 https。
然后页面重新加载,并被重定向。然后测试 2 开始。https 已打开,并已重定向到 https。假设 URL 是 link-view,这是正确的,第三部分始终为真,这意味着,第二条规则现在将 link-view 重定向到 http,因此第一条规则现在再次获取页面,看到它是 http,并将其重新转换为 https,依此类推,无限循环。