Принудительный SSL в .htaccess или в моем PHP-коде приводит к ошибке цикла перенаправления - PullRequest
2 голосов
/ 18 января 2012

Я пытаюсь принудительно использовать HTTPS, надеюсь, это будет сделано с помощью файла .htaccess, но я также пытался использовать код. Я использую Zend Framework и пытался использовать этот код в Bootstrap.php, пытаясь избежать конфликтующих правил или некоторых ошибочных настроек на HTTP-сервере.

public function _initForceSSL() {
    if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
        if(!headers_sent()) {
            header("Status: 301 Moved Permanently");
            header(sprintf(
                'Location: https://%s%s',
                $_SERVER['HTTP_HOST'],
                $_SERVER['REQUEST_URI']
            ));
            exit();
        }
    }
}

Это дает те же результаты, как если бы я, где это сделать ...

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://mydomain.tld/$1 [R,L]

в моем файле .htaccess. Я получаю ту же жалобу на петлю перенаправления на локальном устройстве сервер (где у меня есть полный доступ ко всем настройкам, обычный стек LAMP это). Кроме того, те же результаты на Zend PHPCloud (с использованием Zend-сервера).

Вот мой полный файл .htacces, я пробовал использовать правила в разных местах ...

    setEnv APPLICATION_ENV development

    #setEnv APPLICATION_ENV production
    #setEnv APPLICATION_ENV testing

    RewriteEngine On 

#tried it here

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

#tried it here too...

Кажется, я просто не могу понять, что я делаю неправильно, я пытался также переписать несколько других «популярных» методов. Кроме того, кстати, я использую свое фактическое доменное имя в RewriteRule.

Мое единственное требование - чтобы НЕ было доступно все приложение через незащищенное соединение (только SSL).

1 Ответ

3 голосов
/ 18 января 2012

Если у вас есть доступ к файлу vhost, вы можете сделать это:

<VirtualHost *:80>
    ServerName  example.com

    RewriteEngine on
    RewriteCond %{SERVER_PORT} ^80$
    RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [L,R]
</VirtualHost>

<VirtualHost *:443>
    ServerName  example.com
    ...
</VirtualHost>
...