4

假设您的 URL 的路径是:

/thisisa"quote/helloworld/

那么如何创建rel=canonicalURL 呢?

这是犹太洁食吗?

<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)
4

5 回答 5

7

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

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

是的,引号字符 (U+0022) 不允许以明文形式出现,必须使用%22.

我是否需要在 HTML 属性值中编码双引号字符?

这取决于您如何声明属性值

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

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

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

在某些情况下,作者可以不带任何引号指定属性的值。属性值只能包含字母(az 和 AZ)、数字(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) . '" />';
于 2009-10-12T14:58:50.197 回答
6

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

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

于 2009-10-09T23:02:55.203 回答
1

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

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

于 2009-10-09T23:05:52.157 回答
1

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

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

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

于 2009-10-12T14:31:33.213 回答
0

我会说你想使用十六进制值作为报价%22

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

于 2009-10-09T23:04:12.550 回答