在重写规则中使用 unicode

在重写规则中使用 unicode

.htaccess我在包含 utf8 字符的文件中使用了以下语句RewriteRule.htaccess文件以 utf8 编码保存在记事本中。网站的所有页面都以 utf8 保存,所有页面的字符集均为 utf8。

<IfModule mod_rewrite.c>
RewriteEngine On 
RewriteBase /new/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^هاستینگ/هاست-لینوکس-عادی/$ /linux-regular.php [L]
</IfModule>

但是当我浏览该 URL 时却هاستینگ/هاست-لینوکس-عادی/出现“未找到”错误。

答案1

RewriteBase /new/
:
RewriteRule ^هاستینگ/هاست-لینوکس-عادی/$ /linux-regular.php [L]

事实上,您已经为 设置了特定值RewriteBase,但在 中指定了根相对 URL 路径RewriteRule 代换敲响警钟。该RewriteBase指令只会影响相对的(不以斜线或方案开头)路径替代,所以在这种情况下,它会被忽略——我确信这不是我们的本意——否则,就没有必要首先设置它了。

通过删除RewriteRule 代换那么它将考虑RewriteBase并将被重写为/new/linux-regular.php。例如:

RewriteRule ^هاستینگ/هاست-لینوکس-عادی/$ linux-regular.php [L]

这与您后来的评论一致:“...并从 linux-regular.php 的开始处删除 / 并且它起作用了。”

...特殊字符将以 %xx 十六进制形式编码

在旁边:虽然请求应该是%编码(URL编码),但URL路径RewriteRule 图案匹配项由重写引擎进行 % 解码(URL 解码)。因此,使用RewriteRule 图案在这里是正确的(与其他答案相反)。

如果您特别需要匹配 %-encoded URL-path,那么您将需要使用RewriteCond指令并检查THE_REQUEST服务器变量。

答案2

URL 在线上以纯 ASCII(latin1)编码 - 所有非 ASCII 字符均由客户端(浏览器)以%xx十六进制格式编码...

您可以找到以下内容文章有帮助的。

更具体地说:您的 Apache 配置文件将是纯 ASCII 文本,特殊字符将以%xx十六进制形式编码 - 您甚至可以使用上面引用的 w3schools 页面上提供的简单工具来翻译它。

相关内容