2014-07-08 108 views
4

我有一個角帆的應用程序,我想刪除從URL中配置sails服務器以使用html5Mode?

我加入這個哈希我的客戶app.config

$locationProvider.html5Mode(true); 

和路由工作,直到我刷新頁面。

導航至http://localhost:1337/about工程。我刷新並獲取

{ 
    "status": 404 
} 

from sails server。如何配置sails以使用angularjs html5Mode?

回答

1

這是一個稍微不同的問題,但我有一個以前的答案可能適用。 Page not found when refreshed on SailsJS

你遇到了這個問題,因爲當你重新加載頁面時,sails正在響應,並且它對你的角度路由一無所知。

3

要使用HTML5Mode,您需要將服務器設置爲僅提供根(或「index.html」)文件。 「web.com/index.html」。在我看來,最好的做法是將您的Sails應用程序和您的Angular前端分開分開。通過這種方式,您可以輕鬆設置服務於角度客戶端前端的Web服務器,只爲非AJAX調用提供index.html。

要在sails中做到這一點,沒有「開關」,你可以設置一個應用程序的廣泛政策,檢查角度是否打電話或瀏覽器正在發出呼叫併發送適當的文件,你可以看到下面的代碼。你將不得不確保角度是設置以下頭 X-要求,隨着= XMLHttpRequest的

應用策略

module.exports = function(req, res, next) { 

    // Checks if this is an ajax request 
    // If True then skip this and return requested content 
    // If False then return the index (or root) page 
    if (if !req.isAjax) { 
    return res.view("/index"); 
    } 

    return next(); 
}; 
+0

我在這裏有問題,當我重新加載任何頁面(除(())我得到404。 – krekto

+0

你有你的設置的基本示例,你可以發佈的地方? – Meeker

+0

我只是在角度上啓用app.js的html5mode,添加了上面的警察,並啓用「*」:isAjax;在政策。 – krekto

0

您可以設置一個通配符路由到一個控制器方法,將發送了你的單頁面應用程序或實際資產(如果存在)。如果你有一個明確的URL前綴,那麼這個問題就不會那麼嚴重了,例如我的案例中的/admin。下面是我使用的是什麼:

routes.js:

'GET /admin/*': 'AdminController.index' 

AdminController.js:

var path = require('path'); 
var fs = require('fs'); 

module.exports = { 
    index: function(req, res) { 
     var requestedPath = req.url; 
     var resolvedPath = path.resolve(requestedPath); 
     if (resolvedPath.indexOf('/admin') !== 0) { 
      res.send(403); 
     } else { 
      var publicRoot = sails.config.paths.public; 
      var fullPath = path.join(publicRoot, resolvedPath); 
      fs.exists(fullPath, function(exists) { 
       if (exists) { 
        res.sendfile(resolvedPath, { root: publicRoot }); 
       } else { 
        res.sendfile('/admin/index.html', { root: publicRoot }); 
       } 
      }); 
     } 
    } 
}; 

如果資產的公共區域(如.js文件)下確實存在,發送它下來;否則,請發送index.html。隨着一些偏執的路徑檢查。