在单个页面上强制使用 http,并且站点范围使用 https

在单个页面上强制使用 http,并且站点范围使用 https

在我的网站上,我有一个页面以 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,依此类推,无限循环。

相关内容