2014-09-03 42 views
6

繼另一SO question,我一直在嘗試最新的是(見ligatures.net):創建一個Express JS 4.0應用程序與Openshift HTTPS,包括HTTP重定向

self.ipaddress = process.env.OPENSHIFT_NODEJS_IP; 
self.port  = process.env.OPENSHIFT_NODEJS_PORT || 443; 

if (typeof self.ipaddress === "undefined") { 
    self.ipaddress = "127.0.0.1"; 
}; 

... 
self.app = express(); // 4.8.7 

... 
// Trusting Openshift proxy 
self.app.enable('trust proxy'); 

// Http -> Https redirection middleware 
self.app.use(function (req, res, next) { 

    if (!req.secure()) { 
     var tmp = 'https://' + process.env["DOMAIN_NAME"] + req.originalUrl; 
     console.log("Redirect to: " + tmp); 
     res.redirect(tmp); 
    } else { 
     next(); 
    }    

}); 

... 

// Creating a http server 
https.createServer(self.app).listen(self.port, self.ipaddress, 
    function(err) { 
     if (err) { 
      console.log("Node server error: " + err.toString()); 
     } else { 
      console.log('%s: Node server started on %s:%d ...', 
       Date(Date.now()), self.ipaddress, self.port); 
     } 
}); 

在Openshift日誌,我得到:

屬性 '安全' 對象的#不是一個函數

這是該行:if (!req.secure()) {

證書在控制檯中加載。應用程序在端口8080上成功啓動。

爲什麼我會收到此消息,應如何在OpenShift中創建安全的Express 4.0 https應用程序?有沒有人有操作代碼分享?謝謝!

UPDATE

我已經更新了重定向如下:

// Http -> Https redirection middleware 
self.app.use(function (req, res, next) { 

    if (req.headers['x-forwarded-proto'] === 'http') { 

     var tmp = 'https://' + req.headers.host + req.originalUrl; 
     console.log("SERVER redirect to: " + tmp); 
     res.redirect(tmp); 

    } else { 

     var pt = req.protocol || ""; 
     var ho = req.headers.host || ""; 
     var ur = req.originalUrl || ""; 

     console.log("\nProtocol: " + pt 
        + "\nHost : " + ho 
        + "\nUrl : " + ur); 

     var tmp = req.protocol + '://' + req.headers.host + req.originalUrl; 
     console.log("SERVER no redirect: " + tmp); 
     next(); 

    } 

我看到一對夫婦從控制檯執行以下操作:

SERVER no redirect: http://undefined/ 
Protocol: http 
Host : 
Url :/

和我的應用程序仍然不工作。它看起來像一個bug。

我已經打開了一個問題:https://bugzilla.redhat.com/show_bug.cgi?id=1138137

我還落後CloudFlare的,這可能是問題的一部分。

回答

4

有兩個問題:

I)如果您使用的是Cloudflare的免費計劃,那麼它不會轉發SSL請求。如果您取消激活Cloudflare(例如保留其DNS),那麼SSL請求將轉發到Openshift。

二)對於一些未知的原因,開始它的時候,而瀏覽網頁時,後來也有些空請求到達我的Openshift應用:

req.path:/
req.protocol: http 
req.originalUrl:/
req.secure: false 

在Openshift的KB article提到的代碼不能因爲是工作得很好,對兩個原因。首先,req.path不考慮查詢參數。在Express 4.0中應該使用req.originalUrl

其次代替self.app.get(r, redirectSec, self.routes[r]);,應該在Express 4中添加中間件self.app.use。0:

我的HTTP到HTTPS轉發代碼現在:

// Trusting Openshift proxy 
self.app.enable('trust proxy'); 

// Http -> Https redirection middleware 
self.app.use(function (req, res, next) { 

     if (req.headers['x-forwarded-proto'] === 'http') { 

      var tmp = 'https://' + req.headers.host + req.originalUrl; 
      res.redirect(tmp); 

     } else { 

      return next(); 

     } 

    } 

}); 

一切似乎現在的工作很好。

3

req.secure是屬性,而不是函數。

+0

謝謝,這刪除了錯誤信息。 – JVerstry 2014-09-04 05:53:58

2

嘗試這段代碼從help.openshift.com網站:

function redirectSec(req, res, next) { 
     if (req.headers['x-forwarded-proto'] == 'http') { 
      res.redirect('https://' + req.headers.host + req.path); 
     } else { 
      return next(); 
     } 
    } 

這些都是在本知識庫文章中找到:https://help.openshift.com/hc/en-us/articles/202398810-How-to-redirect-traffic-to-HTTPS-

+0

這段代碼不起作用。查看我的問題中的更新。 – JVerstry 2014-09-04 06:34:53

+0

你有沒有嘗試'沒有'cloudflare,看看是否是這個問題? – 2014-09-11 02:11:50

+0

Cloudflare是該問題的一部分,但您提到的KB代碼需要更新。看到我的答案。 – JVerstry 2014-09-11 14:33:46