1

我有一个生成 URL 的 Zend 应用程序

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

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

实际上我有这个 .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
4

1 回答 1

2

通常对重写规则存在误解,因为它们是在 Web 服务器内部完成的。只要重写规则中不涉及重定向,这是正确的。重定向将带有新 URL 和状态码 3xx 的重定向返回给浏览器。

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

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

现在关于你的第二条规则。此规则告诉浏览器“老兄,您的路径包含打印或下载,您不需要 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 请求。

于 2012-07-17T14:56:11.053 回答