在我正在使用的一个Web应用程序中,我处理了如下所示的URL:
http://localhost:8080/section/value.with.periods
这个value.with.periods
是一个URL参数,就像你在angular的routeProvider
上声明的那样:
angular.config(['$routeProvider', function ($routeProvider) {
$routeProvider
.when('/section/:param', {
templateUrl: 'url-to-template',
controller: 'ExampleCtrl',
resolve: {
...
}
});
}]);
问题是在 Grunt 任务下运行的服务器无法处理包含句点的 URL:
Cannot GET /section/value.with.periods
我正在使用 grunt-contrib-proxy
和 connect-modrewrite
运行 Grunt ,配置connect-modrewrite
的livereload
任务如下:
livereload: {
options: {
open: 'http://localhost:<%= connect.options.port %>',
base: [
'.tmp',
'<%= config.app %>'
],
middleware: function(connect, options) {
if (!Array.isArray(options.base)) {
options.base = [options.base];
}
// Setup the proxy
var middlewares = [proxySnippet];
var modRewrite = require('connect-modrewrite');
middlewares.push(modRewrite(['^[^\.]*$ /index.html [L]']));
// middlewares.push(modRewrite(['!\.html|\.js|\.svg|\.css|\.png|\.jpg\.gif|\swf$ /index.html [L]']));
// Serve static files.
options.base.forEach(function(base) {
middlewares.push(connect.static(base));
});
// Make directory browse-able.
var directory = options.directory || options.base[options.base.length - 1];
middlewares.push(connect.directory(directory));
return middlewares;
}
}
}
我需要能够处理 Angular 上使用的参数上带有句点的 URL。任何帮助将不胜感激。
谢谢。
重写正则表达式会排除所有带有句点的路径:
^[^\.]*$
这意味着:将网址与所有字符匹配,除非它们有反斜杠或句点。所以/section/value.with.periods
会被忽略。
您应该将正则表达式更改为更宽容的内容:
middlewares.push(modRewrite(['^(.*)$ /index.html [L]']));
你应该很高兴。
编辑解决方案:
在评论中,我们得出了答案:上面的正则表达式将重写所有 url 以索引.html,导致其他文件无法提供。有一个注释掉的行,只重写文件扩展名未知的 url:
middlewares.push(modRewrite(['!\.html|\.js|\.svg|\.css|\.png|\.jpg|\.gif|\.swf$ /index.html [L]']));
这给出了预期的结果。有关详细信息,请参阅评论。