我需要做啥才能打开带有特殊字符的 URL

Posted

技术标签:

【中文标题】我需要做啥才能打开带有特殊字符的 URL【英文标题】:What I need to do in order to open URLs with special characters我需要做什么才能打开带有特殊字符的 URL 【发布时间】:2018-09-15 10:42:42 【问题描述】:

您好,我正在尝试使用 php 制作一个对 seo 友好的网址。我正在使用以下代码来转换像 exapmle.com/post/hi-how-are-you 这样的 url 并使用这个 .htaccess 代码

RewriteRule ^post/([\w-]+)/?$ single_post.php?blog_title=$1 [L,QSA]

php 蛞蝓网址

function url_slug($str)    
    $str = mb_strtolower(trim($str), 'UTF-8');
    $str = preg_replace('/[[:^alnum:]]/iu', ' ', $str);
    $str = trim($str);
    $str = preg_replace('/\s+/', '-', $str);
    return $str;

但问题是特殊字符。例如:当我发布一些像 (tırda bir öğün çok çıktı) 这样的土耳其字符时,网址看起来像这样

example.com/post/tırda-bir-öğün-çok-çıktı

对于蛞蝓来说一切正常,但是当我打开网址时,我无法使用 (tırda-bir-öğün-çok-çıktı) 获取任何数据。

我需要做什么才能打开带有特殊字符的 URL?

我们有机会用英文打印所有特殊字符吗?就像当我从数据中发布某些内容时,url_slug 可以将特殊字符更改为英文字符,例如:

tırda bir öğün çok çıktı

转换成英文字符

tirda-bir-ogun-cok-cikti

【问题讨论】:

echo 'example.com/post/'.urlencode( 'tırda bir öğün çok çıktı' ); 正是为此目的而存在,因此您最终会得到example.com/post/t%C4%B1rda%20bir%20%C3%B6%C4%9F%C3%BCn%20%C3%A7ok%20%C3%A7%C4%B1kt%C4%B1 @MonkeyZeus 实际上它只会对其进行编码,而不是转换为用户友好的。 @MonkeyZeus 那不是用户友好的转换 @Azzo 你要求“seo-friendly”。 Google 应该可以毫无问题地解读您网站上正确编码的链接,因此如果有人实际上在搜索 öğün,那么他们应该会看到您的文章。将其转换为 ogun 会抵消这种好处。 @Justinas 如果这是真的,那么为什么谷歌搜索 öğün 会产生与 ogun 不同的结果 【参考方案1】:

最常见的方法是使用一些映射,其中非拉丁字母作为键,拉丁字母表示:

$map = [
   'š' => 'sh',
   ...
];

然后你使用替换:

str_replace(array_keys($map), array_values($map), $slug);

另一种方法是使用iconv函数:

iconv('UTF-8', 'ASCII//TRANSLIT', $slug);

【讨论】:

so iconv('UTF-8', 'ASCII//TRANSLIT', $slug); 转换所有特殊字符?【参考方案2】:

\w 仅匹配 word char 为 [a-zA-Z0-9_] 且不包含所有 unicode 字符的单词字符。

把你的规则改成这样:

RewriteRule ^post/([^/]+)/?$ single_post.php?blog_title=$1 [L,QSA]

[^/]+ 将匹配任何非 / 的字符,包括 unicode 字符。

你也可以稍微调整一下 php 代码:

function url_slug($str)    
    $str = mb_strtolower(trim($str), 'UTF-8');
    $str = preg_replace('/[^\pL\pN]+/u', ' ', $str);
    $str = trim($str);
    $str = preg_replace('/\h+/', '-', $str);
    return $str;

【讨论】:

非常感谢您没有打扰我并回答我。 如果你有时间,我可以问你一个问题吗?我用 php switch 切换页面,文件位于 pages 文件夹中,所以我的问题是如何使用 htaccess 获取 url,例如 http://localhost://8888/group/name 。没有组文件夹,我只是不会在 url 中显示组。如果可以,有可能吗? 我已经尝试过这样但一些包含的 php 文件没有显示:RewriteRule ^group/([\w-]+)/?$ sources/group.php?group_username=$1 [L,QSA] 亲爱的我已经从这个链接问了这个问题,你能帮我检查一下吗? HERE 我在等你亲爱的

以上是关于我需要做啥才能打开带有特殊字符的 URL的主要内容,如果未能解决你的问题,请参考以下文章

在 Apache Web 服务器中读取带有特殊字符的图像

Symfony 4 Dotenv 转义特殊字符

带有特殊字符的目标 URL

使用带有特殊字符的 Django 的 url 模板标签

带有 åäö(特殊字符)的 Alamofire GET 请求,无效 url

使用带有特殊字符的 URL 名称是个好主意吗? [关闭]