使用Zend Framework将特定文件夹除外的所有URL重写为SSL

时间:2012-06-03 18:36:12

标签: php zend-framework mod-rewrite apache2

提前感谢任何帮助。 我为我们的网络应用程序设置了Zend Framework,并且到目前为止使用基本的SSL重定向工作正常。除了几条路径之外,我们想将所有网址重定向到SSL。一条路径工作正常,只是加载图像文件。但是另一条路径没有,它是一个Zend Framework Controller,它有一个需要请求参数的Action。

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

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才能使框架正常运行,但不能仅将ssl用于单个控制器和action / wsrv / itemdata。

我感谢任何帮助。谢谢!

编辑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行。

1 个答案:

答案 0 :(得分:0)

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

htaccess https redirect only on specific Zend Frameworks controller/actions

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

此解决方案的唯一例外是发送的URL中的尾部“/”。如果我不发送尾部斜杠,它仍然会自动转发给index.php。因为无论如何我都需要传递参数,所以尾随斜杠就在那里,所以对我有用。 作品:/ wsrv / itemdata / Works:/ 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]