草庐IT

javascript - ExpressJS 路由器规范化/规范 url

coder 2024-07-19 原文

我正在寻找带有 ExpressJS 服务器的 SPA 的规范化/规范化 URL。

尽管服务器端路由器支持的是 SPA - 应用程序 URL 的模板可能略有不同。其中一个区别是 <link rel="canonical" href="https://example.com{{ originalPath }}">标签。不是相关细节,而是解释问题的上下文。我希望只有一个 URL 以 200 响应,它的变体将以 301/302 重定向到它(适用于活人和搜索引擎)。

我想让 url 区分大小写和严格(没有额外的斜线),类似于 Router 选项,但非规范网址(大小写或额外斜杠不同)应该 301/302 重定向到规范网址而不是 404。

在大多数应用程序中,我只想强制使用 * 的网址小写的路由(查询除外),没有额外的斜杠。 IE。 app.all('*', ...) ,重定向是:

/Foo/Bar/ -> /foo/bar
/foo/Bar?Baz -> /foo/bar?Baz

但如果路由是明确定义的,则可能会有异常(exception)。例如,有 camel-cased 路由:

possiblyNestedRouter.route('/somePath')...
possiblyNestedRouter.route('/anotherPath/:Param')...

并且所有非规范 url 都应重定向到规范(参数大小写保持不变):

/somepath/ -> /somePath
/anotherpath/FOO -> /anotherPath/FOO

规范 url 背后的逻辑非常简单,所以奇怪的是我找不到关于这个主题的任何关于 ExpressJS 的内容。

最好的方法是什么?是否已经有可以提供帮助的中间件?

最佳答案

我一直在寻找 npm,但找不到任何东西,所以这让我抓狂了,我为 express 编写了一个小任务来为每个请求做,这似乎工作正常。请将此添加到您的代码中。

var urls = {
  '/main' : '/main',
  '/anotherMain' : '/anotherMain'
}

app.use(function(req, res, next){

  var index = req.url.lastIndexOf('/');

  //We are checking to see if there is an extra slash first
  if(req.url[index+1] == null || req.url[index+1] == undefined || req.url[index+1] == '/'){
     //slashes are wrong
     res.send("please enter a correct url");
     res.end();
  }else{

      for(var item in urls){
         if(req.url != item && req.url.toUpperCase() == item.toUpperCase()){
           res.redirect(item);
           console.log("redirected");
           //redirected
         }else if (req.url == item) {
           console.log("correct url");
           next();
         }else{
           //url doesn't exist
         }
     }

  }
  next();

});

app.get('/main', function(req, res){
  res.render('mainpage');
});

app.get('/anotherMain', function(req, res){
  res.send("here here");
});

用法

您所要做的就是像上面那样将您的 urls 添加到 urls 对象,并为其赋予相同的键值。而已。看看它是多么容易。现在,您所有的客户请求都将重定向到正确的页面区分大小写

更新

POST请求我也做了一个,我觉得挺准确的,你也试试看。如果您想要在用户混淆斜杠时进行重定向,您需要为其编写一些 regex。我没有时间,我的大脑也被炸了,所以我做了一个简单的。你可以随心所欲地改变它。每个网络结构都有自己的一套规则。

var urlsPOST = {
  '/upload' : '/upload'
}

app.use(function(req, res, next){

  if(req.method == 'POST'){

    var index = req.url.lastIndexOf('/');

    if(req.url[index+1] == null || req.url[index+1] == undefined || req.url[index+1] == '/'){

       //slashes are wrong
       res.sendStatus(400);
       res.end();
       return false;

    }else{

      for(var item in urlsPOST){
          if(req.url != item && req.url.toUpperCase() == item.toUpperCase()){
            res.redirect(307, item);
            res.end();
            return false;
            //redirected

          }else if (req.url == item) {
            console.log("correct url");
            next();

          }else{
            res.sendStatus(404).send("invalid URL");
            return false;
            //url doesn't exist
          }
      }
    }
  }
  next();
});

关于javascript - ExpressJS 路由器规范化/规范 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42180083/

有关javascript - ExpressJS 路由器规范化/规范 url的更多相关文章

  1. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  2. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  3. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  4. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  5. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  6. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  7. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  8. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  9. ruby-on-rails - Rails - 使用/自定义 URL : '/dashboard' 指定根路径 - 2

    如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b

  10. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

随机推荐