我有一个使用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
答案 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,尚未经过良好测试。某些功能没有看到覆盖值的事实意味着您在网站中引入了不一致,这可能会导致细微的错误!如果出现更干净的解决方案,那就去吧!