2014-02-11 63 views
1

我有一個使用MODx Revolution(2.2.10-pl,高級安裝)的網站,我們稱之爲www.example.com,我想用http和https訪問它。配置MODx Revolution可以同時使用http和https

要實現這一點,我調整了site_url上下文設置爲[[++url_scheme]]www.example.com/。使用[[~id]]創建的鏈接似乎沒問題,但有時,生成的鏈接真的很奇怪。我的解釋是,以編程方式創建鏈接的代碼不適用於我的設置,但我不知道爲什麼,或者我將如何啓用http和https。

問題第一,以下示例:我應該如何設置site_url或任何其他網站/環境設置,以便我的網站上的鏈接可以同時處理http和https?可選地,在我看到一個錯誤或行爲給出革命的標籤評估語義的行爲?


不端行爲的例子:

當我在管理器點擊「視圖」別名爲example的資源,在打開該地址是

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

其中xyz是我的經理網址。預期網址當然

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

哪裏發生這種情況是失敗的登錄另一種情況;我登錄調用看起來是這樣的(減去不相關部分):

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

unauthorized_page的預期完整的URL是

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

但打開登陸失敗爲username的URL是

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

第二個例子對於http來說是一樣的,當然除了方案之外;我還沒有用http登錄經理。


編輯

.htaccess在Web根目錄:

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

怎麼樣在MODx根htacess文件?在那裏重寫/在哪些條件下?也可能是管理員根目錄下的MODx的htacess。試圖想想我過去遇到過的問題。 – camelCase

+0

關於htaccess的好處,我添加了根和管理器目錄的非註釋部分。似乎有關FURLs的部分在第一個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); 
    } 
} 

的最後兩行重定向到與makeUrl生成的URL,這將是像[[++url_scheme]]www.example.com/etc注:我在這裏我不是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 ''; 

連同

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

一個[[++site_url]]注意,似乎鏌鋣的某些部分不注意到這一點更新,這就是爲什麼仍然在site_url中使用[[++url_scheme]]的原因。據我現在可以告訴,沒有看到更新的部分,如[[~id]],適用於url_scheme

編輯這當然只是修復管理器中的「查看」按鈕,如果你相應地調整管理模板。

警告這當然很黑,而且還沒有很好的測試。某些功能沒有看到被覆蓋的值這一事實意味着您在您的網站中引入了不一致,這可能會導致微妙的錯誤!如果一個更乾淨的解決方案出現,去吧!

+1

嘗試從$ url = $ this-> modx-> makeUrl($ redirectToOnFailedAuth,'',$ p,'full');應該只輸出一個沒有域名的網址。這可能會解決您的一些問題。 – orbitory

相關問題