.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 页面上提供的简单工具来翻译它。