【发布时间】:2014-01-15 14:49:07
【问题描述】:
为了使我的网站外观和感觉一致,我大量使用 SSI。我所有的页面都有相同的页眉(标题除外)和页脚。这些行为类似于模板并包含在 SSI 指令中。通过 SSI #set-variables 提供变量字段内容。
这是我在不使用 HTML 生成器的情况下找到的最接近“函数”的等价物。
一个标准的页面结构如下:
<!--#set var="PageTitle" value="Référence" -->
<!--#include virtual="/header.shtml" -->
<section>
Specific page content
</section>
<!--#include virtual="/footer.shtml" -->
文件header.shtml 包含<!DOCTYPE > <html> <head> ... </head> <<body> <header> ... </header> 和类似的<footer> ... </footer> </body> </html> footer.shtml。
文件 header.shtml 用一个元素为页面创建标题:
<title><!--#echo var="PageTitle" --></title>
只要我的变量 PageTitle 的标题字符串只包含可打印的 ASCII 字符(即,只要我用英文书写),一切都很好。如果我想使用 ASCII 可打印集之外的字符插入任何语言的标题,事情就会变得更加复杂。
如果这个字符串放在<title>元素中,就没有问题。
例如,上面的法语单词打印为 Référence。 UTF-8 序列 \x52 \x53 \xA9 ... 像 ISO-8859-x 一样打印。 \x53 \xA9 是 \xC0 + \x29 = U+00E9 LATIN SMALL LETTER E WITH ACUTE 的 UTF-8 序列,这是所需的字符。
我尝试在#echo 指令中使用一些encoding= 属性,但无济于事,因为它会影响ISO-8859-1 特殊字符并且似乎无法理解UTF-8。
从我在服务器发送的 HTML 中看到的,该字符串使用实体引用来表示任何“可疑”字符:
Référence
有没有办法将 Apache SSI #echo 处理置于“透明”模式?
Apache 手册说 encoding= 默认为 entity (我得到了结果)。它也可以设置为URL 以保护 URL 免受恶意使用(即 % 转义)。但是,没有none 设置。
当然,作为一种解决方法,我可以直接在字符串中使用字符实体引用,但这对用户不友好:键入可从键盘访问的字符并具有屏幕上的目标字符便于校对。
编辑:
解决了!
已解决,但不知道是不是“标准”。
我尝试在有问题的#echo 语句中添加encoding="none",一切正常!
现在,我必须检查这是否适用于不同的 Apache 版本。
【问题讨论】:
-
如何检查浏览器收到的 HTML?旧的“查看源代码”功能显示实际文本,但任何更高级的(尤其是显示 DOM 树的开发人员工具)都不会。而且,浏览器应该如何知道您的文本是 UTF-8?您没有提及任何有关 HTTP 标头的内容。
-
我没有提到所有的簿记;网站的“手动”和 SSI 版本中的所有内容都是相同的(“Content-Type: text/html;charset=utf-8”的 HTTP 标头在页面文本之前显式发送)。 Unicode UTF-8 字节序列 -> 在#echo 处理期间发生实体引用(以保护我免受意外 XSS 的影响)。我想暂时禁用这个转换。
-
请使用“回答您自己的问题”按钮提供解决方案。否则,答案将无法投票或接受,问题将显示为未回答。
-
我知道,但我的“声誉”不允许我回答自己的问题。我考虑添加一条新评论,但决定改为编辑我的问题。也许您可以将我的编辑复制为已解决的答案?问候。
标签: apache unicode character-encoding echo ssi