Пренапишете всички URL в SSL с изключение на определени папки със Zend Framework

благодаря предварително за всяка помощ. Имам настройка на Zend Framework за нашето уеб приложение и досега работех добре с основно SSL пренасочване. Бихме искали да пренасочим всички URL адреси към SSL, с изключение на няколко пътя. Един път работи добре и просто зарежда файлове с изображения. Но другият път не го прави и това е контролер на Zend Framework с действие, изискващо аргументи на заявката.

Ето нашата текуща, работеща конфигурация:

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 само за единичен контролер и действие /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, който минава през рамката.


person gregthegeek    schedule 03.06.2012    source източник


Отговори (1)


Намерих решение на моя проблем. Този въпрос, публикуван от друг потребител, помогна и беше свързан, но не можах да накарам неговото решение да работи:

https://stackoverflow.com/questions/6580154/htaccess-https-redirect-only-on-specific-zend-frameworks-controller-actions

Моето решение проработи, с изключение на един проблем, който не ми попречи да продължа напред. Правилата за пренаписване, изброени по-долу, ми позволяват да пропусна SSL връзка под конкретен контролер на Zend Framework и методи за действие, като същевременно принуждавам всичко друго, което не съществува, да използва нормални 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]
person gregthegeek    schedule 04.06.2012