手风琴可折叠不适用于 Heroku(CSP 问题)

Accordion Collapsible Does not work only in Heroku (CSP Issue)

我遇到了一个很奇怪的问题。我在 Heroku 中实现了一些嵌套的可折叠和简单的可折叠,它们在 localhost.But 上表现出色,但我仍然不明白为什么可折叠不起作用。欢迎任何帮助,如果没有可折叠的工作,我的网络应用程序将显得混乱:(

哈巴狗布局

doctype html
html(lang='en')
    head
        title= title
        meta(charset='utf-8')
        meta(name='viewport', content='width=device-width, initial-scale=1')
        script(src="https://code.jquery.com/jquery-3.5.1.slim.min.js", integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj", crossorigin="anonymous")
        link(rel="stylesheet", href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css", integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z", crossorigin="anonymous")
        script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js", integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV", crossorigin="anonymous")
        link(rel='stylesheet', href='/stylesheets/style.css')
    body
    div(class='container-fluid')
      div(class='row')
        div(class='col-sm-2')
          block sidebar
            ul(class='sidebar-nav')
              li
                a(href='/catalog') Home
              li
                a(href='/catalog/resources') All Resources

              li
                a(href='/catalog/bookings') My Bookings
        div(class='col-sm-10')
          block content

可折叠 PUG

extends layout
block content
  -var i=0;
  -var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
        #accordion.panel-group
        each doc in object
           flex-container(style='background-color:#c7e7fa; justify-content:space-around; position:relative;flex-direction:row;margin-left:20px;margin-right:auto; margin-top:20px; width:45%; ')
            .three(style='text-align:center;margin-left:auto; margin-right:auto; flex: 0 0 40%;')
              h4='' + doc._id.year + '  ' + months[doc._id.month - 1]
              -i++;
            #accordion.panel-group
             .panel-heading
               h4.panel-title
                 a.accordion-toggle(data-toggle='collapse', href='#collapses' + i)
                   h6 See Total Cost
             .panel-collapse.collapse.in(id="collapses" + i)
                .three(style='width:100%; margin-left:auto; margin-right:auto; flex: 0 0 25%;')
                  h5= 'Total Montly Cost:  ' + doc.total_cost_month.toFixed(2)
                                .panel-heading
                                  h4.panel-title
                                    a.accordion-toggle(data-toggle='collapse', href='#collapse'+i)
                                      hr
                                      h6 See All Booking details
                                .panel-collapse.collapse.in(id="collapse"+i)
                                  each booking in doc.bookings_month
                                    flex-container(style='background-color:#a6f1a6; width:100%;')
                                                three.flex-container
                                                    | #[strong Start:] #{moment(booking.date_started).format('DD/MM/YYYY HH:mm')}
                                                three.flex-container
                                                    | #[strong  Finish:] #{moment(booking.date_finished).format('DD/MM/YYYY HH:mm')}
                                                three.flex-container
                                                    | #[strong  Cost:]  #{booking.total_cost.toFixed(2)}
                                                li
        else
            h1 No booking history found
            h3= 'Start booking now' + "  "
             a(href='/catalog/resources')
              | here:

这样就解决了。问题源于服务器端。特别是来自 helmetjs,app.use(helmet())。所以 helmet 默认情况下会阻止所有内容,如脚本样式表和多媒体 links 正在加载到 pug 视图中,以防止 XSS 攻击。所以我们要做的是告诉头盔我们想要将一些 link 引用列入白名单,这可能是样式表 link、脚本 link 和图像 link 等. 我们通过在我们的代码 (app.js) 中包含此代码片段来做到这一点。

app.use(helmet({
  contentSecurityPolicy:{
    directives:{
      "default-src":["'self'"],
      "script-src":["https://code.jquery.com/jquery-3.5.1.slim.min.js","'sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj'","https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js","'sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV'"],
      "style-src": ["'self'","https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css","'unsafe-inline'"],
      "object-src":["'none'"],


    },
  }
}
));

所以头盔是我们已经在我们的应用程序中导入的模块。这个模块有一些属性。在我们的问题中,我们关注 属性 contentSecurityPolicy,因为我们需要解决 CSP 问题。为了放置一些异常,我们将它们添加到 directives property.These 异常是键值对,其中键是将在我们的网络应用程序中加载的内容类型,值是实际的 link 携带内容。所以现在我们将解决解决方案,注意属性的顺序,因为这非常重要。 "default-src":["'self'"] 默认为 属性,我们告诉网络应用程序仅从其域 'self' 加载内容。 接下来是 "script-src",这是我们的 jquery 脚本,其中包含从我们上面的 layoyt 中获取的散列以及使用我们的 bootstrap 样式表的脚本,这也有它的散列。然后是 "style-src" 这是实际的 bootstrap 模板,我们添加 'self' (我不太确定 self 是否不是可选的)然后我们使用 "'unsafe-inline'" 这意味着我们的应用程序加载存在于每个特定哈巴狗模板中的散列。最后 "object-src" 是一个 属性 我们应该分配为 "'none'"。 因此,请注意命令的顺序