配置MODx Revolution以使用http和https

时间:2014-02-11 14:19:25

标签: https modx modx-revolution

我有一个使用MODx Revolution的网站(2.2.10-pl,高级安装),我们称之为www.example.com,我想用http和https访问它。

为实现这一目标,我将site_url上下文设置调整为[[++url_scheme]]www.example.com/。使用[[~id]]创建的链接似乎没问题,但有时候,生成的链接真的很奇怪。我的解释是,以编程方式创建链接的代码不适用于我的设置,但我不知道为什么,或者我将如何启用http和https。

首先问题,以下示例:如何设置site_url或任何其他网站/上下文设置,以便我网站上的链接同时使用http和https?可选地,我看到了一个错误,或者给出了Revolution的标签评估语义的预期行为?


不良行为示例:

当我在管理器中点击具有别名example的资源的“查看”时,打开的地址是

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

其中xyz是我的经理网址。预期的URL当然是

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

发生这种情况的另一种情况是登录失败;我的登录电话看起来像这样(减去不相关的部分):

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

unauthorized_page预期的完整网址为

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

但是为username登录失败而打开的网址是

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

http的第二个例子是相同的,当然除了方案之外;我没有使用http登录管理器。


修改

webroot上的

.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

1 个答案:

答案 0 :(得分: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);
    }
}

最后两行重定向到使用makeUrl生成的网址,类似于[[++url_scheme]]www.example.com/etc注意:我不是100%肯定,因为我无法轻易查看原始网址。但结论仍然有效。如果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一起使用。

编辑如果您相应地调整经理模板,这当然只会修复经理中的“查看”按钮。

警告这当然非常hacky,尚未经过良好测试。某些功能没有看到覆盖值的事实意味着您在网站中引入了不一致,这可能会导致细微的错误!如果出现更干净的解决方案,那就去吧!