咕噜声:带有句点的位置 URL 应用

Grunt: Location URL app with period

本文关键字:位置 URL 应用 句点      更新时间:2023-09-26

在我正在使用的一个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-proxyconnect-modrewrite 运行 Grunt ,配置connect-modrewritelivereload任务如下:

        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]']));

这给出了预期的结果。有关详细信息,请参阅评论。