1

提前感谢您的帮助。我已经为我们的 Web 应用程序设置了 Zend Framework,并且到目前为止使用基本的 SSL 重定向工作得很好。我们希望将所有 URL 重定向到 SSL,除了几个路径。一个路径工作正常,只是加载图像文件。但另一条路径没有,它是一个 Zend 框架控制器,其动作需要请求参数。

这是我们当前的工作配置:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} !(/images)
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

以上适用于排除图像并允许 ZF 运行,但我们还想排除 URI 路径 /wsrv/itemdata 中的任何内容,我们尝试使用此条件:

RewriteCond %{REQUEST_URI} !(/wsrv/itemdata)

/wsrv/itemdata 可能包含以下格式的多个参数:

/wsrv/itemdata/item_nbr/111111/some_other_arg/a-value

我们的问题是它总是重定向到 /index.php,它被定向到 SSL。我们需要重定向到 index.php 以使框架正常工作,但不能仅对单个控制器和操作 /wsrv/itemdata 使用 ssl。

我很感激任何帮助。谢谢!

编辑 6-4-12:(已解决!主要是) 它不是 URL 重写,它在我的 Zend Framework 加载器中。我添加了下面的规则并使用了一些测试文件,规则有效。但是我的框架设置中的某些东西正在重定向它。

RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} !(/images/)
RewriteCond %{REQUEST_URI} !(/wsrv/itemdata/)
RewriteCond %{REQUEST_URI} !(/test/make/)
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

上述工作,除了 /wsrv/itemdata 行,它正在通过框架。

4

1 回答 1

0

我找到了解决我的问题的方法。另一个用户发布的这个问题有帮助并且是相关的,但我无法让他的解决方案起作用:

htaccess https 仅在特定 Zend Frameworks 控制器/操作上重定向

我的解决方案有效,除了一个问题,这并没有阻止我继续前进。下面列出的重写规则允许我在特定的 Zend Framework 控制器和操作方法下省略 SSL 连接,同时强制任何其他不存在的东西使用正常的 SSL 连接。(基本上,强制一切使用 SSL,但只有一条路径)

此解决方案的唯一例外是发送的 URL 中的尾随“/”。如果我不发送斜杠,它仍然会自动将我转发到 index.php。因为无论如何我都需要传入参数,所以斜杠就在那里,所以对我有用。作品:/wsrv/itemdata/ 作品:/wsrv/itemdata/item_nbr/123456/otherarg/otherval 无效:/wsrv/itemdata

这是最终的、复杂的重写规则:

    RewriteEngine On

#if req is normal file, dir
#then pass in request unchanged (show css, js, img, etc, no ZF)
#do not proc more rules
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]

#if req is ssl
#   and not wsrv/itemdata
#   and not images
#   and not test/make
# then rewrite req to index.php to use ZF
#do not proc more rules
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !wsrv/itemdata/
RewriteCond %{REQUEST_URI} !images/ 
RewriteCond %{REQUEST_URI} !test/make/ 
RewriteRule ^.*$ index.php [L]

#NOTE: itemdata/ must have trailing / in client requsts
# In other words, requesting /wsrv/itemdata will redirect to index
# I don't know how to fix that yet
# But / is always used anyway because request args are used
# Ex: /wsrv/itemdata/item_nbr/12345678

#if req is NOT ssl
#   and we want wsrv/itemdata/
#then rewrite without ssl to ZF index.php
#do not proc more rules
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} wsrv/itemdata/
RewriteRule ^.*$ index.php [L]

# Last if none above match, check for non-ssl
#if req is ssl
#   and not wsrv/itemdata
#   and not images
#   and not test/make
# then REDIRECT to https:// using same URI
#do not proc more rules
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} !wsrv/itemdata/
RewriteCond %{REQUEST_URI} !images/ 
RewriteCond %{REQUEST_URI} !test/make/ 
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
于 2012-06-04T21:23:11.493 回答