2014-02-11 1 views
1

У меня есть сайт с использованием MODx Revolution (2.2.10-pl, advanced install), назовем его www.example.com, который я хочу быть доступным как с http, так и с https.Настройка MODx Revolution для работы с http и https

Для этого я изменил настройку контекста site_url как [[++url_scheme]]www.example.com/. Ссылки, созданные с использованием [[~id]], кажутся в порядке, однако иногда созданные сгенерированные ссылки действительно странные. Моя интерпретация заключается в том, что код для создания ссылок программно не работает с моими настройками, но я не знаю, почему, или как еще я хотел бы включить как http, так и https.

Вопрос первый, примеры ниже: Как я должен установить site_url или любой другой параметр сайта/контекст, так что ссылки на моем сайте работе как с HTTP и HTTPS? Возможно, поведение, которое я вижу в ошибке, или ожидаемое поведение, учитывая семантику оценки тегов Revolution?

примеры

Misbehavior:

Когда я нажимаю на «View» в менеджере ресурса с псевдонимом example, адрес, который открыт является

https://www.example.com/xyz/[[++url_scheme]]www.example.com/example/ 

где xyz является мой URL-адрес менеджера. Ожидаемый URL, конечно

https://www.example.com/example/ 

Другой случай, когда это происходит за неудачных попыток входа; мой Войти вызов выглядит следующим образом (минус несущественных деталей):

[[!Login? &redirectToOnFailedAuth=`[[++unauthorized_page]]`]] 

unauthorized_page «s ожидается полный URL является

https://www.example.com/special/401 

но URL, который открыт для неудавшегося входа в username является

https://www.example.com/[[++url_scheme]]www.example.com/[[++url_scheme]]www.example.com/special/401?u=username 

Второй пример такой же для http, за исключением схемы, конечно; Я не зашел в менеджер с http.


EDIT

.htaccess в вебсервера:

RewriteEngine On 
RewriteBase/

# redirect all requests to /en/favicon.ico to /favicon.ico 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(en)/favicon.ico$ favicon.ico [L,QSA] 
#RewriteRule ^(en|nl|de)/favicon.ico$ favicon.ico [L,QSA] 

# redirect all requests to /en/assets* /assets* 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(en)/assets(.*)$ assets$2 [L,QSA] 
#RewriteRule ^(en|nl|de)/assets(.*)$ assets$2 [L,QSA] 

# redirect all other requests to /en/* 
# to index.php and set the cultureKey parameter 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(en)?/?(.*)$ index.php?cultureKey=$1&q=$2 [L,QSA] 
#RewriteRule ^(en|nl|de)?/?(.*)$ index.php?cultureKey=$1&q=$2 [L,QSA] 

.htaccess в каталоге менеджера:

RewriteEngine On 
RewriteBase/
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/xyz/$1 
+0

Как насчет файла htacess в корне MODx? Является ли переписывание включенным/отключенным там ... при каких условиях? Также может быть htacess в корне менеджера для MODx. Просто пытаюсь думать о проблемах, с которыми я сталкивался в прошлом. – camelCase

+0

Хороший вопрос о htaccess, я добавил части без комментариев для каталога root и manager. Кажется, что часть о FURL не включена в первом htaccess, хотя мы ее используем (успешно) ... Я попытаюсь выяснить, что там происходит ... –

+1

какой твой базовый тег href? Можете ли вы попробовать этот ? На самом деле это просто без каких-либо htaccess или контекстных настроек. – orbitory

ответ

1

Проблема с $modx->makeUrl().Например, для вызова

[[!Login? &redirectToOnFailedAuth=`[[++unauthorized_page]]`]] 

, в core/components/login/controllers/web/Login.php:

public function checkForRedirectOnFailedAuth(modProcessorResponse $response) { 
    $redirectToOnFailedAuth = $this->getProperty('redirectToOnFailedAuth',false,'isset'); 
    if ($redirectToOnFailedAuth && $redirectToOnFailedAuth != $this->modx->resource->get('id')) { 
     $p = array(
      'u' => $this->dictionary->get('username'), 
     ); 
     $message = $response->getMessage(); 
     if (!empty($message)) $params['m'] = $message; 
     $url = $this->modx->makeUrl($redirectToOnFailedAuth,'',$p,'full'); 
     $this->modx->sendRedirect($url); 
    } 
} 

последние две строки сделать переадресацию на URL, генерируемый makeUrl, который будет что-то вроде [[++url_scheme]]www.example.com/etc (примечание: I Я не уверен на 100% здесь, так как я не могу легко смотреть на необработанный URL-адрес. Однако выводы все еще сохраняются). Если URL-адрес просто отображается на странице, это не проблема, потому что MODx будет анализировать тег, прежде чем вставлять его в вывод html. Однако, поскольку URL-адрес используется непосредственно для перенаправления, такая замена не происходит, и браузер интерпретирует его как относительный URL-адрес, в результате чего целевые URL-адреса, такие как https://www.example.com/[[++url_scheme]]www.example.com/etc.

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

$modx->config['site_url'] = $modx->config['url_scheme'] . substr($modx->config['site_url'], strlen('[[++url_scheme]]')); 
return ''; 

вместе с [[++site_url]] из

[[++url_scheme]]www.example.com/ 

Обратите внимание, что некоторые части MODx, кажется, не заметил этого обновление, поэтому важно использовать [[++url_scheme]] в вашем site_url. Насколько я могу судить сейчас, части, которые не видят обновления, такие как [[~id]], работают правильно с url_scheme.

EDIT Это, конечно же, исправляет кнопки «Просмотр» в менеджере, если вы соответствующим образом настраиваете шаблоны менеджера.

ПРЕДУПРЕЖДЕНИЕ это, конечно, очень хаки, и еще не очень хорошо протестировано. Тот факт, что некоторые функции не видят перезаписанного значения, означает, что вы вводите несогласованность на свой сайт, что может привести к тонким ошибкам! Если появится более чистое решение, иди за ним!

+1

попробуйте удалить полный из $ url = $ this-> modx-> makeUrl ($ redirectToOnFailedAuth, '', $ p, 'full'); Должен просто выводить URL-адрес без домена. Это может решить некоторые из ваших проблем. – orbitory