代码之家  ›  专栏  ›  技术社区  ›  joedevon

如果URL包含引号,如何指定rel=canonical值?

  •  4
  • joedevon  · 技术社区  · 15 年前

    假设URL的路径是:

    /thisisa"quote/helloworld/
    

    那么你如何创造 rel=canonical 网址?

    这是犹太药吗?

    <link rel="canonical" href="/thisisa&amp;quot;/helloworld/" />
    

    更新

    为了澄清,我得到了一个表单提交,我需要将查询字符串的一部分转换为URL。所以步骤是:

    1. HTAccess 是否重定向
    2. PHP以查询字符串的形式处理目录。
    3. 查询字符串将动态插入到:
      • 标题,
      • 描述,
      • 关键词
      • 标准URL。
      • 吐回表单的输入框

    因此,我需要知道在每一步中都必须进行哪些处理……在第一次切割时,这是我要做的:

    • 题目: htmlspecialchars($rawQuery)
    • 描述: htmlspecialchars($rawQery)
    • 关键词: htmlspecialchars($rawquery)
    • 规范URL:这是一个棘手的部分。它必须与同一个URL匹配 HTAccess 重定向到,但即使如此,我认为原始查询是不安全的,因为引号会导致JavaScript注入。担心 urlencode($rawquery) 既然它来自于URL,它是否已经被URL编码了?
    • 吐回原形: htmlspecialchars($rawquery)
    5 回复  |  直到 12 年前
        1
  •  7
  •   Gumbo    15 年前

    你必须把你的问题分成两部分:

    我需要在URL路径中编码双引号字符吗?

    是的,引号字符(U+0022)不允许为纯格式,必须用 %22 .

    是否需要将双引号字符编码为HTML属性值?

    这取决于 how you declare the attribute value :

    默认情况下,SGML要求使用双引号(ASCII十进制34)或单引号(ASCII十进制39)分隔所有属性值。当值由双引号分隔时,单引号可以包含在属性值中,反之亦然。作者还可以使用数字字符引用来表示双引号。( &#34; )单引号( &#39; )。对于双引号,作者还可以使用字符实体引用 &quot; .

    • 如果使用双引号字符声明属性值( attr = " value ,则必须使用 character reference ( &“; , &α34; &#x22; )
    • 如果在属性值声明中使用单引号字符(U+0027)( 阿特尔 = ' 价值 ,则不需要对引号字符进行编码。但建议这样做。

    由于属性值中有斜杠和双引号,所以第三种情况(完全不使用引号)不适用:

    在某些情况下,作者可以指定不带引号的属性值。属性值只能包含字母(a-z和a-z)、数字(0-9)、连字符(ASCII十进制45)、句点(ASCII十进制46)、下划线(ASCII十进制95)和冒号(ASCII十进制58)。我们建议使用引号,即使有可能消除它们。

    现在把两个答案放在一起

    因为双引号必须编码在URL中( 但单引号是! )可以使用以下方法对路径段或URL路径执行此操作:

    $path = '/thisisa"quote/helloworld/';
    $path = implode('/', array_map('rawurlencode', explode('/', $path)));
    

    如果要将该URL路径放入HTML属性中,请使用 htmlspecialchars 用于对剩余的特殊HTML字符进行编码的函数:

    echo '<link rel="canonical" href="' . htmlspecialchars($path) . '" />';
    
        2
  •  6
  •   lod3n    15 年前

    使用URL转义,在这种情况下为%22

    http://everything2.com/title/URL+escape+sequences

        3
  •  1
  •   womp    15 年前

    引用甚至不是有效的URL字符,所以我认为从长远来看,您应该解决这个问题。它通过以下方式从URI语法中明确排除: RFC 2396 .

    但要解决当前的问题,您需要使用 %22 .

        4
  •  1
  •   austin cheney    15 年前

    如果URL包含双引号,则使用单引号包含它。

    <link rel="canonical" href='foo.com/thisisa"/helloworld/' />
    

    不要在URI字符串中使用HTML编码。这是无效的句法,因为它是一个函数特殊字符,所以必须在uris中对其进行编码。相反,总是对URI使用百分比编码。

        5
  •  0
  •   Joe Phillips    15 年前

    我想说的是,您要对一个引号使用十六进制值,它是 %22 .

    阅读此内容了解更多 URL Encoding .