提前感谢任何帮助。 我为我们的网络应用程序设置了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行。
答案 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]