配置MODx Revolution以同时使用http和https

配置MODx Revolution以同时使用http和https,https,modx,modx-revolution,Https,Modx,Modx Revolution,我有一个使用MODx Revolution(2.2.10-pl,高级安装)的网站,我们称之为www.example.com,我希望可以通过http和https访问该网站 为了实现这一点,我将site\u url上下文设置调整为[[++url\u scheme]]www.example.com/。使用[[~id]]创建的链接看起来不错,但是,有时候,生成的链接真的很奇怪。我的解释是,以编程方式创建链接的代码不适用于我的设置,但我不知道为什么,或者如何启用http和https 首先提问,下面的示例:

我有一个使用MODx Revolution(2.2.10-pl,高级安装)的网站,我们称之为
www.example.com
,我希望可以通过http和https访问该网站

为了实现这一点,我将
site\u url
上下文设置调整为
[[++url\u scheme]]www.example.com/
。使用
[[~id]]
创建的链接看起来不错,但是,有时候,生成的链接真的很奇怪。我的解释是,以编程方式创建链接的代码不适用于我的设置,但我不知道为什么,或者如何启用http和https

首先提问,下面的示例:我应该如何设置
站点url
或任何其他站点/上下文设置,以便我站点上的链接同时使用http和https?或者,我看到的行为是bug,还是给定Revolution的标记评估语义的预期行为


不当行为示例:

当我在管理器中单击别名为
示例的资源的“查看”时,打开的地址为

https://www.example.com/xyz/[[++url_scheme]]www.example.com/example/
其中
xyz
是我的经理URL。当然,预期的URL是

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

发生这种情况的另一种情况是登录失败;我的登录调用如下所示(减去不相关的部分):

未经授权的页面
的预期完整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登录到管理器


编辑

.htaccess
位于webroot:

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

问题在于
$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,类似于
[++URL\u scheme]]www.example.com/etc
注意:这里我不是100%确定,因为我无法轻松查看原始URL。不过结论仍然成立)。如果URL只是显示在页面上,这没有问题,因为MODx将在将标签插入html输出之前解析标签。但是,由于URL直接用于重定向,因此不会进行此类替换,浏览器会将其解释为相对URL,从而生成目标URL,如
https://www.example.com/[[++url\u scheme]]www.example.com/etc

问题到此为止。为了避免这种情况,
site\u url
必须是一个文本值,其中没有任何标记。作为一种变通方法,我现在在模板中首先使用以下代码段:

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

[[++url_scheme]]www.example.com/
请注意,MODx的某些部分似乎没有注意到此更新,这就是为什么在
站点中仍然使用
[[++url\u scheme]]
非常重要的原因。就我目前所知,那些看不到更新的部分,比如
[[[~id]]]
,可以正常使用
url\u方案

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


警告这当然是非常粗糙的,而且还没有经过很好的测试。事实上,有些功能看不到被覆盖的值,这意味着您正在将不一致性引入您的网站,这可能会导致微妙的错误!如果出现了更干净的解决方案,那就去做吧

那么MODx根目录下的htacess文件呢?在什么条件下,重写是开/关的?也可能是MODx的manager根目录中的htacess。我只是想想想我在过去遇到过的类似问题。htaccess的优点是,我为根目录和管理器目录添加了非注释部分。在第一次htaccess中,似乎没有启用关于FURLs的部分,尽管我们(成功地)使用了它。。。我会尽力找出那里发生了什么…你的基本href标签是什么?你能试试这个吗?事实上,这没有任何htaccess或上下文调整。@orbitory是的,非常正确。忘了模板中的那个。啊,是的,我忘了基本href!它是
,即带有缓存。但是,我认为我已经找到了这种行为的原因(请参阅答案),因此我不会尝试在干净的安装中重现该问题。如果您对我的答案有什么建议,我将不胜感激。请尝试从$url=$this->modx->makeUrl($redirectToOnFailedAuth,,$p,'full')中删除完整内容;应该只输出一个没有域的url。这可能会解决你的一些问题。
[[++url_scheme]]www.example.com/