【问题标题】:If a URL contains a quote how do you specify the rel=canonical value?如果 URL 包含引号,您如何指定 rel=canonical 值?
【发布时间】:2009-10-09 23:00:44
【问题描述】:

假设你的 URL 的路径是:

/thisisa"quote/helloworld/

那么如何创建rel=canonical URL?

这是犹太洁食吗?

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

更新

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

  1. .htaccess 进行重定向
  2. PHP 将目录作为查询字符串处理。
  3. 查询字符串将被动态插入到:
    • 标题,
    • 说明,
    • 关键字
    • 规范网址。
    • 吐回表单的输入框

所以我需要知道每一步都必须完成哪些处理...在第一次剪辑时,这是我的看法:

  • 标题:htmlspecialchars($rawQuery)
  • 描述:htmlspecialchars($rawQery)
  • 关键字:htmlspecialchars($rawQuery)
  • 规范 URL:这是棘手的部分。它必须与 .htaccess 重定向到的相同 URL 匹配,但即便如此,我认为原始查询是不安全的,因为引号会导致 JavaScript 注入。担心urlencode($rawquery),因为它来自 URL,它不是已经被 URL 编码了吗?
  • 吐回形式:htmlspecialchars($rawQuery)

【问题讨论】:

    标签: php security seo canonical-link


    【解决方案1】:

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

    是否需要对 URL 路径中的双引号字符进行编码?

    是的,引号字符 (U+0022) 不允许使用纯格式,必须使用 %22 编码。

    是否需要对 HTML 属性值中的双引号字符进行编码?

    这取决于how you declare the attribute value:

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

    • 如果您使用双引号字符来声明属性值 (attr="@987654330 @"),那么您必须使用 character reference&amp;quot;&amp;#34;&amp;#x22;)对属性值声明中的 douvke 引号字符进行编码。
    • 如果您在属性值声明中使用单引号字符 (U+0027) (attr=' value'),则不需要对引号字符进行编码。但建议这样做。

    由于属性值中有斜线和双引号,第三种情况(根本不使用引号)不适用:

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

    现在把两个答案放在一起

    由于双引号必须在 URL 中编码(但单引号是!),您可以对路径段或您的 URL 路径使用以下方法: p>

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

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

    echo '<link rel="canonical" href="' . htmlspecialchars($path) . '" />';
    

    【讨论】:

      【解决方案2】:

      使用 URL 转义,在本例中为 %22

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

      【讨论】:

        【解决方案3】:

        引号甚至不是有效的 URL 字符,所以我认为您应该长期解决这个问题。 RFC 2396 明确将其从 URI 语法中排除。

        不过,要解决眼前的问题,您需要使用%22 转义字符。

        【讨论】:

        • 实际上,我没有选择网址。我必须将查询字符串部分转换为 url……并且需要确保查询字符串在任何地方使用都是安全的。我将通过一些后续行动来更新这个问题。
        【解决方案4】:

        如果 URL 包含双引号,则将其包含在单引号中。

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

        不要在 URI 字符串中使用 HTML 编码。这是无效的语法,因为&符号必须在 URI 中编码,因为它是函数特殊字符。而是始终对 URI 使用百分比编码。

        【讨论】:

          【解决方案5】:

          我会说您想使用 HEX 值作为 %22 的报价。

          阅读本文以了解有关 URL Encoding 的更多信息。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-17
            • 2011-09-26
            • 1970-01-01
            • 1970-01-01
            • 2012-06-14
            相关资源
            最近更新 更多