【问题标题】:Syntax for ETag?ETag 的语法?
【发布时间】:2011-10-06 20:19:59
【问题描述】:

Redbot 报告我的网页包含无效标题:

ETag 标头的语法无效。

我的标题设置为:

ETag: 4ae413bd

为什么无效?

ETag 的语法是什么?

【问题讨论】:

    标签: http http-headers etag


    【解决方案1】:

    试试ETag: "4ae413bd"。 ETag 的值必须遵循ABNF 形式:

      entity-tag = [ weak ] opaque-tag
      weak       = "W/"
      opaque-tag = quoted-string
    
      quoted-string  = ( <"> *(qdtext | quoted-pair ) <"> )
      qdtext         = <any TEXT except <">>
      quoted-pair    = "\" CHAR
      CHAR           = <any US-ASCII character (octets 0 - 127)>
      TEXT           = <any OCTET except CTLs, but including LWS>
      OCTET          = <any 8-bit sequence of data>
      LWS            = [CRLF] 1*( SP | HT )
      CTL            = <any US-ASCII control character (octets 0 - 31) and DEL (127)>
      CRLF           = CR LF
      CR             = <US-ASCII CR, carriage return (13)>
      LF             = <US-ASCII LF, linefeed (10)>
      SP             = <US-ASCII SP, space (32)>
      HT             = <US-ASCII HT, horizontal-tab (9)>
    

    ,在 regular 正则表达式中基本上是([wW]/)?"([^"]|\\")*"

    请注意,"\""/" 都是 etag 的有效值。

    参考:section-14.19section-3.11section-2.2

    【讨论】:

    • 虽然HTTP 1.1允许"\",但HTTP 1.1之二的草案却不允许。 2007 年,W3C 考虑了这个问题 - 参见 w3.org/Protocols/HTTP/1.1/rfc2616bis/issues/#i31 - 并确定语法错误。它已在草案 04 中修复。您可以在 greenbytes.de/tech/webdav/… 看到编辑。因此,无论何时 HTTP 1.1 bis 最终发布(假设确实如此)"\" 将不再有效,因此您最好避免它,即使它在今天技术上是允许的。
    • @IanGriffiths,预计发货日期是什么时候?
    • 我认为计划是在 2013 年 9 月将其作为提议标准提交。(相关工作组的最后一次电话会议应该在今年早些时候结束,我认为确实按计划进行.) 我认为没有计划从“提议”到完全成熟需要多长时间 - 我相信这取决于以后才变得明显的事情(例如,采用率,是否发现问题) .
    • 通俗地说:值必须以“(双引号)开头和结尾
    • RFC tools.ietf.org/html/rfc7232#section-2.3 的更新版本。它不允许使用空格,例如
    【解决方案2】:

    正如 Arnaud 所说,请确保您引用了该值。

    替换

    new EntityTagHeaderValue("0");
    

    new EntityTagHeaderValue("\"0\"");
    

    【讨论】:

      【解决方案3】:

      “ETag 是一个不透明的标识符,由网络服务器分配给在 URL 中找到的特定版本的资源”。这意味着它几乎可以是任何东西。

      问题可能是语法,使用:

      ETag: "4ae413bd"
      

      【讨论】:

        【解决方案4】:

        如果您因为下面的堆栈跟踪而来到这里,请确保取消选中导致此错误的 Visual Studio 中的“启用浏览器链接”选项:

        Conversion> [13:31:10 ERR] Connection id "0HLJ153E20LDJ", Request id "0HLJ153E20LDJ:00000003": An unhandled exception was thrown by the application.
        Conversion> System.ObjectDisposedException: The response has been aborted due to an unhandled application exception. ---> System.FormatException: Invalid ETag name
        Conversion>    at Microsoft.Net.Http.Headers.EntityTagHeaderValue..ctor(StringSegment tag, Boolean isWeak)
        Conversion>    at Microsoft.Net.Http.Headers.EntityTagHeaderValue..ctor(StringSegment tag)
        Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.BrowserLinkMiddleWareUtil.AddToETag(ResponseHeaders responseHeader, Int32 port)
        Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.BrowserLinkMiddleware.<>c__DisplayClass7_0.<ExecuteWithFilter>b__0()
        Conversion>    at Microsoft.AspNetCore.Http.HttpResponse.<>c.<.cctor>b__30_0(Object callback)
        Conversion>    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.FireOnStartingMayAwait(Stack`1 onStarting)
        Conversion>    --- End of inner exception stack trace ---
        Conversion>    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ThrowResponseAbortedException()
        Conversion>    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.InitializeResponseAsync(Int32 firstWriteByteCount)
        Conversion>    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.WriteAsync(ReadOnlyMemory`1 data, CancellationToken cancellationToken)
        Conversion>    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpResponseStream.WriteAsync(Byte[] buffer, Int32 offset, Int32 count, CancellationToken cancellationToken)
        Conversion>    at System.IO.Stream.WriteAsync(Byte[] buffer, Int32 offset, Int32 count)
        Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.ScriptInjectionFilterStream.<>c__DisplayClass37_0.<<CreateResponseHandler>b__0>d.MoveNext()
        Conversion> --- End of stack trace from previous location where exception was thrown ---
        Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.SocketReader.ReadBytesIntoResponseHandler(Int64 totalBytesToRead, ResponseHandler handler, CancellationToken cancellationToken)
        Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.HttpSocketAdapter.ResponseReader.ReadBytesIntoResponse(Int64 bytesToRead)
        Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.HttpSocketAdapter.ResponseReader.ReadChunkedContent()
        Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.HttpSocketAdapter.ResponseReader.ReadResponse()
        Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.DelayConnectingHttpSocketAdapter.Microsoft.VisualStudio.Web.BrowserLink.IHttpSocketAdapter.WaitForResponseComplete()
        Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.ScriptInjectionFilterStream.WaitForFilterComplete()
        Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.BrowserLinkMiddleware.ExecuteWithFilter(IHttpSocketAdapter injectScriptSocket, String requestId, HttpContext httpContext)
        Conversion>    at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
        Conversion>    at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
        Conversion>    at Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.Invoke(HttpContext httpContext)
        Conversion>    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)
        

        【讨论】:

          猜你喜欢
          • 2017-04-20
          • 1970-01-01
          • 1970-01-01
          • 2018-10-19
          • 2012-06-09
          • 2013-09-12
          • 1970-01-01
          • 1970-01-01
          • 2014-12-17
          相关资源
          最近更新 更多