utf-8 字符和 apache2 重写规则的问题

2024-01-01

我看到帖子了验证 htaccess 重写规则中的 utf-8 https://stackoverflow.com/questions/2565864/validating-utf-8-in-htaccess-rewrite-rule我认为这很好,但我首先遇到一个更根本的问题:

我需要扩展以处理查询字符串参数、目录名称、文件以及用于向用户显示等的 utf-8 字符。

我用 DefaultCharset utf-8 配置了我的 Apache,如果重要的话也配置了我的 php。我最初的重写规则过滤了除常规 A-Za-z 以及下划线和连字符之外的所有内容。它起作用了。其他任何东西都会给你一个 404 (这就是我想要的!)现在,但是似乎一切都匹配,包括我不想要的东西,但是,尽管它看起来匹配,但它不会进入查询字符串,除非它是一个常规的 A-Za-z_- 字符串。

我觉得这很令人困惑,因为规则说将您匹配的任何内容放入查询字符串中:

这是原来的规则:

RewriteRule ^/puzzle/([A-Za-z_-]+)$ /puzzle.php?g=$1 [NC]

这是修订后的规则:

RewriteRule ^/puzzle/(\w+)$ /puzzle.php?g=$1 [NC]

我进行了更改,因为我在某处读到 \w 与 A-Zetc 等所有字母字符匹配。只匹配那些没有重音符号之类的东西。

我使用哪一个规则似乎并不重要:以下是发生的情况:

在应用程序中我有这个:

echo $_GET['g'];

如果我给它一个像这样的网址http://mydomain.com/puzzle/USA http://mydomain.com/puzzle/USA它回响“美国”并且工作正常。
如果我给它一个像这样的网址http://mydomain.com/puzzle/México http://mydomain.com/puzzle/M%C3%A9xico它对此没有任何回应,并警告我索引 g 未定义,当然也没有获得墨西哥的资源。
如果我给它一个像这样的网址http://mydomain.com/puzzle/fuzzle/buzzle/j.qle http://mydomain.com/puzzle/fuzzle/buzzle/j.qle它做同样的事情。
最后一个案例应该是 404!

无论我使用上述哪一条规则,它都会执行此操作。我配置了重写日志

   RewriteLogLevel 5
   RewriteLog /opt/local/apache2/logs/puzzles.httpd.rewrite

但它是空的。

这是来自常规访问日志(状态为 200)

[26/May/2010:11:21:42 -0700] "GET /puzzle/M%C3%A9xico HTTP/1.1" 200 342
[26/May/2010:11:21:54 -0700] "GET /puzzle/M/l.foo HTTP/1.1" 200 342

我该怎么做才能将这些 $%#$@(*#@!!! 字符而不是斜杠、点或其他非 alpha 字符放入我的程序中,一旦到达,它会正确解码它们吗??? posix char 类会吗工作好一点了吗?我还需要配置什么吗?


我建议您激活 MultiViews 并忘记 mod_rewrite。添加到你的apache配置中相关Directory/VirtualHost部分:

Options +MultiViews
#should already be set to this, but it doesn't hurt:
AcceptPathInfo Default

不,只要客户端在其 Accept 标头中包含相应的 mime 类型,您就可以随时省略扩展。

现在请求/puzzle/whatever将映射到/puzzle.php and $_SERVER['PATH_INFO']将充满/whatever.


如果你想用 mod_rewrite 来做到这一点也是可以的。测试字符串为RewriteRule未转义(%xx 部分转换为它们代表的实际字节)。您可以使用以下命令获取原始转义字符串%{REQUEST_URI} or %{THE_REQUEST}(最后一个还包含 HTTP 方法和版本)。

按照惯例,Web 浏览器在 URL 中使用 UTF-8 编码。这意味着“México”将被编码为M%C2%82xico, not M%82xico,如果浏览器使用 ISO-8859-1,则这是预期的。还,[a-zA-Z]不会匹配é。但是,这应该有效:

RewriteCond %{REQUEST_URI} ^/puzzle/[^/]*$
RewriteRule ^/puzzle/(.*)$ /puzzle.php?q=$1 [B,L]

你需要B转义反向引用,因为您在查询字符串中使用它,其中允许的字符集小于 URI 的其余部分。

你应该注意的是RewriteRule不支持 unicode。除了.*可能会给出(可能)不正确的结果。甚至[^/]可能不起作用,因为/“字符”(读:字节)可以是多字节字符序列的一部分。如果RewriteRule知道 unicode,你的解决方案是\w应该管用。

因为您不想匹配子目录,并且RewriteRule ^/puzzle/[^/]*不是一个选项,该检查被推迟到RewriteCond使用(转义)%{REQUEST_URI}.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

utf-8 字符和 apache2 重写规则的问题 的相关文章

  • 如何在没有引用的情况下复制对象?

    PHP5 OOP 有据可查对象通过引用传递 http php net manual en language oop5 references php默认情况下 如果这是默认的 在我看来 有一种非默认的方式可以在没有参考的情况下进行复制 如何
  • postgreSQL 在 WAMP 上的集成

    我刚刚在 Windows 7 上安装了 postgreSQL 我正在尝试将 postgreSQL 与 WAMP 服务器集成 为此 我在 httpd conf 和 php ini 文件中进行了以下更改 1个加载模块c path to libp
  • 将数组拆分为特定数量的块

    我知道array chunk 允许将数组拆分为多个块 但块的数量根据元素的数量而变化 我需要的是始终将数组拆分为特定数量的数组 例如 4 个数组 以下代码将数组分为 3 个块 两个块各有 2 个元素 1 个块有 1 个元素 我想要的是将数组
  • 如何在html中制作多行类型的文本框?

  • 如何从字符串中删除所有数字?

    我想删除字符串 0 9 中的所有数字 我写了这段有效的代码 words preg replace 0 words remove numbers words preg replace 1 words remove numbers words
  • Zend Framework Zend_Form 装饰器: 位于按钮元素内部?

    我有一个像这样创建的按钮元素 submit new Zend Form Element Button submit submit gt setLabel My Button submit gt setDecorators array Vie
  • php下拉菜单人口

    我正在尝试编写一个 php 脚本 该脚本将根据主下拉菜单的选择填充第二个下拉菜单 我想使用 jquery 来完成所有非页面刷新的事情 但我发现现有的所有东西都很难理解和修改 你知道有什么写得很好且易于理解的东西吗 或者可能是现有的教程 下面
  • PHP cURL 在本地工作,在 AWS 服务器上出现错误 77

    最新更新 脚本作为管理员用户通过 SSH shell 作为 php script php 成功运行 当由 nginx 用户运行时 curl 命令无法执行 https 请求 所以我猜测这是nginx用户无法正确使用curl的问题 我已经检查了
  • 如何在 WordPress 中按类别获取所有帖子

    我想在 WordPress 中按类别获取帖子 args array post type gt project postslist get posts args 0 gt WP Post 对象 ID gt 421 post author gt
  • 带有 LDAP 身份验证的 SVN 不起作用

    我首先从我的设置开始 为此我们有 2 台服务器 Server1 将用于所有源代码 文件等 在 Server2 上 我们拥有所有用户信息和登录信息 两台服务器都运行在 Centos 6 4 上 现在我们要在 server1 上设置一个 SVN
  • JavaScript 中带前导零的数字发生变化

    我使用 print 语句从 php 调用 javascript 函数来打印 html 代码 并且传入一个整数 但是 在 php 中传递的值与 javascript 函数接收到的数字不匹配 我不知道为什么 这是调用 javascript 函数
  • PHP、jQuery 和 Ajax 调用乱序

    我正在使用 jQuery 进行 Ajax 调用 我有 x 数量的 Ajax 调用附加到 div 这些 Ajax 加载请求是由 PHP foreach 循环生成的 问题是它们渲染的顺序不正确 它们被设置在数组中
  • 尝试获取 Google accessToken

    看起来 无论我做什么 谷歌都在竭尽全力阻止我完成这个研究项目 我的项目让我使用 Google 电子表格作为数据库 并使用所述电子表格中的数据执行程序化的 Google 图片搜索 并向最终用户显示一些结果 设置说明 我开始按照此处的说明进行操
  • 如何处理 AJAX 请求中的会话超时

    我相信你们都熟悉使用 AJAX 的投票系统 嗯 看那边 我有类似的东西 当你投票赞成或反对时 它使用 AJAX 从 votes php 请求新值 问题是我正在使用会话来获取用户 ID 因此一个人只能投票一次 如果他们在页面上坐了一个小时然后
  • phpinfo 说 php.ini 路径是 C:\Windows 但那里没有 php.ini

    我们正在尝试从 PHP5 切换到 PHP7 现在我们已经安装了 Apache 并且 PHP 可以运行了 然而 我们在php ini文件没有任何作用 Via phpinfo 我们意识到原因是Configuration File php ini
  • PHP:在脚本完成之前获取输出

    我有一个名为 data php 的脚本 如下所示 do some stuff echo result do some other stuff eg database operations 我需要在另一个脚本中使用 data php 的输出
  • UTF-8、PHP、Win7 - 现在是否有解决方案可以使用 php 在 Win 7 上保存 UTF-8 文件名?

    更新 只是为了不让您阅读所有内容 PHP 开头 7 1 0alpha2 在 Windows 上支持 UTF 8 文件名 感谢阿纳托尔 贝尔斯基 根据 stackoverflow 上的一些链接 我找到了部分答案 https stackover
  • 使用 fopen() 包装器创建 ZIP 文件

    如何使用以下命令创建 ZIP 文件fopen 包装器 http es php net manual en wrappers compression php 这显然是not道路
  • PDO语法错误

    我在一个项目中使用 PDO 但提交时出现语法错误 这是我的代码
  • 如何在 PHP 中从字符串类名实例化? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何创建返回方法名称的新实例 不幸的是我收到这个错误 错误 类名必须是有效的对象或字符串 这是我的代码 class Foo public f

随机推荐