在某些URL Zend Framework上禁用SSL

时间:2012-07-16 16:53:41

标签: .htaccess zend-framework mod-rewrite

我有一个生成这样的网址的Zend应用程序

http://miapp.com/module/controller/action/params/values

我想从SSL中排除某个具有参数(打印或下载)

的网址

实际上我有.htaccess参数通过SSL重定向所有请求并生成动态URL重写

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-s     
RewriteCond %{REQUEST_FILENAME} !-l     
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [NC,L]
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off

但是如何排除包含打印或下载的URL?

尝试类似的东西:(但我有重定向循环错误

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,NC,L]
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_REFERER} !^https(.*)/(print|download)(.*)$ [NC]
RewriteCond %{REQUEST_URI} !^(.*)/(print|download)(.*)$ [NC]
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,NC,L]
RewriteCond %{REQUEST_FILENAME} !-s     
RewriteCond %{REQUEST_FILENAME} !-l     
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [NC,L]
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off

1 个答案:

答案 0 :(得分:2)

关于重写规则通常存在误解,因为它们是在Web服务器内完成的。只要重写规则中没有重定向,就是这样。重定向将带有新URL和STATUS CODE 3xx的重定向返回给浏览器。

使用第二个htaccess,您有两个重定向。您的第一条规则告诉浏览器“Dude,使用SSL。再试一次”。如果请求不是HTTPS,则在返回带有新URL到客户端的301状态代码后,将终止连接。 htaccess文件中不再处理任何行。浏览器必须向服务器发送新请求。

如果您的第一句话是正确的,并且您在没有https的情况下在Zend Framework中创建URL,那么这是一个奖励。如果你这样做,你基本上会产生大量的流量,因为你的链接的每个请求都被重定向,即返回并由浏览器重新发送。您应该使用https在Zend中创建URL以避免这种情况。

现在关于你的第二条规则。此规则告诉浏览器“Dude,您的路径包含打印或下载,您不需要HTTPS。请重试。”如上所述,连接现在终止,并且在htaccess文件中不再处理任何行。当然,这个新请求将会对你的第一条规则产生影响,这条规则将在你提到的循环中结束。

现在你真正需要的就是这个,我相信(我无法测试它)。您将打印|下载作为例外包含在HTTPS条件中。

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_REFERER} !^https(.*)/(print|download)(.*)$ [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,NC,L]

在你的Zend应用程序中,你必须确保你的链接只是HTTP。不是因为重写规则可以工作,而是你的IE请求。