Перенаправление htaccess https только на определенный контроллер / действия Zend Frameworks - PullRequest
0 голосов
/ 05 июля 2011

Я новичок в этом сообществе, но время от времени находил его действительно полезным.

Я много раз искал ответ, но не нашел ничего, что мне нужно.Я пытался решить это самостоятельно, но я все еще получаю ошибки, поэтому я надеюсь найти кого-то, кто может показать мне правильный путь ...: -)

У меня есть "классика"Веб-сайт ZF со многими URL-адресами контроллеров / действий, которые перенаправляются в файл index.php с помощью файла .htaccess.

Теперь мне нужно перенаправить пару контроллеров на ssl-соединение https, исключая некоторые действия обоихконтроллеры.

Я пытался это сделать так:


Options +FollowSymLinks

RewriteEngine on
RewriteBase /

RewriteCond %{HTTP_HOST} ^mydomain\.tld [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond $1 ^!((member|shop)/(?!(index|login))(.*))
RewriteRule ^(.*) http://%{HTTP_HOST}/$1 [L,R=301]

RewriteCond %{HTTPS} off
RewriteCond $1 ^((member|shop)/(?!(index|login))(.*))
RewriteRule ^(.*) https://%{HTTP_HOST}/$1 [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !\.(js|ico|gif|jpg|png|css|swf|pdf|txt)$ index.php

Кажется, это работает, когда я иду в / member controller Но тогда, когда я иду, например, на другой контроллер/ index или / about не перенаправляет к http-соединению (порт 80), и если я пытаюсь немного изменить условие rewrite, то иногда выполняет цикл перенаправления, и браузер выдает мне уведомление, блокирующее соединение с сайтом.

Есть ли кто-нибудь, кто мог бы показать мне правильный синтакс для использования в моих условиях перезаписи, чтобы позволить обоим контроллерам (исключая данные действия) при подключении https и вернуться к какtandard http соединение при смене контроллера?

Заранее спасибо.

Алессандро

Ответы [ 4 ]

0 голосов
/ 08 июля 2011

Наконец я решил это! Я выстоял в поисках ответа, потому что я думаю, что делает это с .htaccess чище, умнее и прост в обслуживании. По существу, проблема была связана с тем, что регулярное выражение, используемое в блоке «ssl to non-ssl», не соответствовало корректно переданному значению (лучше всего подходит для чтения теперь env-переменной% {THE_REQUEST}, избегая, в некоторых случаях, ошибки erroneus перенаправляет цикл.

Я вставляю сюда рабочий код для дальнейшего использования:


    Options +FollowSymLinks

    RewriteEngine On

    RewriteBase /

    RewriteOptions MaxRedirects=1



    RewriteCond %{HTTP_HOST} ^yoursite\.tld [NC]

    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]



    RewriteCond %{HTTPS} off

    RewriteCond %{THE_REQUEST} ^[A-Z]+\ /((controller1|controller2)/(?!(action1|action2))(.*))\ HTTP/

    RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [L,R=301]



    RewriteCond %{HTTPS} on

    RewriteCond %{THE_REQUEST} !^[A-Z]+\ /((controller1|controller2)/(?!(action1|action2))(.*))\ HTTP/

    RewriteRule ^(.*)$ http://%{SERVER_NAME}/$1 [L,R=301]



    RewriteCond %{REQUEST_FILENAME} \.(js|css|ico|gif|jpg|png|swf|txt|pdf)$ [OR]

    RewriteCond %{REQUEST_FILENAME} -s [OR]

    RewriteCond %{REQUEST_FILENAME} -l [OR]

    RewriteCond %{REQUEST_FILENAME} -d

    RewriteRule ^.*$ - [NC,L]



    RewriteCond %{REQUEST_FILENAME} !-f

    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule ^.*$ index.php [NC,L]
0 голосов
/ 05 июля 2011

Метод, который мы используем для перенаправления на https, - это оставить стандартные настройки Zend Framework .htaccess и создать помощник действий для перенаправления на https при необходимости.Наш код помощника действий:

<?php
class RequireSSL extends Zend_Controller_Action_Helper_Abstract
{
    public function direct()
    {
        if(empty($_SERVER['HTTPS']) && $config['billing']['requireSSL'])
        {
            $redirector = $this->getActionController()->getHelper('Redirector');
            $redirector->goToUrlAndExit('https://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']);
        }
    }
}

Затем, когда вы находитесь в действии контроллера, к которому вам нужно получить доступ через HTTPS, вы просто вызываете эту функцию в начале:

$this->_helper->requireSSL();

ТакжеВот еще один метод использования помощников действий, который будет немного более подробным, если он вам нужен:

http://juriansluiman.nl/en/article/110/in-control-of-https-for-action-controllers

Надеюсь, это поможет!

0 голосов
/ 06 июля 2011

Я обнаружил источник проблемы, но мне все еще нужна поддержка, чтобы понять, как ее решить.

Я протестировал на локальной машине linux htaccess, и результат был таким же ... проверяя отдельно два оператора условия https (вкл. И выкл.), Они правильно работают, перенаправляя на основе заданного регулярного выражения RewriteCond. При сборке работает только редирект с http на https. Перенаправление HTTP на http работает только в том случае, если регулярное выражение не сопоставлено, иначе оно перенаправляет на http://www.mydomain.tld/index.php

Итак, я наконец попытался удалить последний оператор htaccess, и он начал работать правильно, но, очевидно, он не находит URL, так как он больше не перенаправляет на index.php.

Похоже, после правильного перенаправления https index.php создает проблему. Поэтому я спрашиваю себя, есть ли способ избежать этого и заставить его работать правильно.

Как я уже писал ранее, это типичная проблема этого htaccess, так как его поведение одинаково на тестовом и на рабочем сервере (разные варианты Linux).

Я поставил здесь рабочий код:


Options +FollowSymLinks

RewriteEngine on
RewriteBase /

#RewriteCond %{HTTP_HOST} ^mydomain\.tld [NC]
#RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond $1 !^((member|shop)/(?!(index|login))(.*))
RewriteRule ^(.*) http://%{HTTP_HOST}/$1 [L,R=302]

RewriteCond %{HTTPS} off
RewriteCond $1 ^((member|shop)/(?!(index|login))(.*))
RewriteRule ^(.*) https://%{HTTP_HOST}/$1 [L,R=302]

#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule !\.(js|ico|gif|jpg|png|css|swf|pdf|txt)$ index.php
0 голосов
/ 05 июля 2011

Вместо этого попробуйте эти правила (замените соответствующие строки):

RewriteCond %{HTTPS} on [NC]
RewriteCond %{REQUEST_URI} !^/(member|shop)/ [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]

RewriteCond %{HTTPS} off [NC]
RewriteCond %{REQUEST_URI} ^/(member|shop)/ [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
  1. Эти правила немного просты (HTTPS будет применяться ко ВСЕМ URL в контроллерах /member/ и /shop/ (например, /member/login, /member/dashboard, /member/orders/15423/invoice и т. Д.)
  2. Отрицание ! должно быть перед ^ в директиве RewriteCond - если вы хотите использовать свои собственные правила, замените RewriteCond $1 ^!((member|shop)/(?!(index|login))(.*)) на RewriteCond $1 !^((member|shop)/(?!(index|login))(.*))
...