【问题标题】:htaccess url rewrite in dutch language and english languagehtaccess url用荷兰语和英语重写
【发布时间】:2013-08-27 12:59:53
【问题描述】:

我正在处理我的子域中的 htaccess。

我的 htaccess 脚本如下所示

RewriteCond %{HTTP_HOST} ^demo\.example\.com/carrental$
RewriteRule (.*) carrental/([^/.]+)/([^/.]+)/([^/.]+) [R=301,L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)$ carrental/locateaddress.php?country=$1&city=$2&locate=$3 [QSA]

RewriteCond %{HTTP_HOST} ^demo\.example\.com/carrental$
RewriteRule (.*) carrental/([^/.]+)/([^/.]+) [R=301,L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)$ carrental/city.php?country=$1&city=$2 [QSA]

RewriteCond %{HTTP_HOST} ^demo\.example\.com/carrental$
RewriteRule (.*) carrental/([^/.]+) [R=301,L]
RewriteRule ^([a-zA-Z0-9_-]+)$ carrental/country.php?country=$1 [QSA]

我有 2 个问题。

  1. 我想在我的网址中传递特殊字符。
    我已经尝试(.*),但它遇到了很多问题。我想将特殊字符传递给([a-zA-Z0-9_-]+)

  2. 我的主要问题是我有一个网址。当我的链接翻译成荷兰语时。 网址:http://demo.osiztechnologies.com/carrental/Albanië

问题是因为Albanië。它显示 404 错误。如果我把它改成英文就可以了。

如何用特殊字符重写 URL?

【问题讨论】:

    标签: php regex .htaccess mod-rewrite url-rewriting


    【解决方案1】:

    %{HTTP_HOST} 变量是 HTTP 请求的“Host:”标头。它只是一个主机名,该字段中没有给出路径信息。因此:

    RewriteCond %{HTTP_HOST} ^demo\.example\.com/carrental$
    

    永远不会匹配。不知道为什么会出现,因为应用条件的结果规则也是错误的:

    RewriteRule (.*) carrental/([^/.]+)/([^/.]+)/([^/.]+) [R=301,L]
    

    在这里,您正在匹配 整个 URI(通过 (.*)),然后将浏览器重定向到:

    /carrental/([^/.]+)/([^/.]+)/([^/.]+)
    

    注意那些([^/.]+)。它们不会被任何东西取代,这实际上就是您发送浏览器的地方。

    就特殊字符而言。 Rob Quist 只说对了一半。虽然它们确实被浏览器编码成转义序列,如%C3%AB,但重写引擎在应用任何规则之前将它们解码回unicode字符。

    所以,假设您想包含ë,那么您的规则将如下所示:

    RewriteRule ^([a-zA-Z0-9_-]+)/([ëa-zA-Z0-9_-]+)$ carrental/locateaddress.php?country=$1&city=$2 [QSA]
    

    您可以将所有可能的 unicode 字符粘贴在方括号之间,但您可以通过使用类似于损坏规则中的分组来使所有内容更容易匹配:

    RewriteRule ^([^/.]+)/([^/.]+)/([^/.]+)$ carrental/locateaddress.php?country=$1&city=$2&locate=$3 [L,QSA]
    RewriteRule ^([^/.]+)/([^/.]+)$ carrental/city.php?country=$1&city=$2 [L,QSA]
    RewriteRule ^([^/.]+)$ carrental/country.php?country=$1 [L,QSA]
    

    【讨论】:

      【解决方案2】:

      那是行不通的。您需要将它们替换为特殊字符(在本例中为 %C3%AB)才能正常工作。

      这里最好的解决方案是为每条记录制作 2 个单词 - 一个唯一的 SEO-URL 和真实标题。

      让真正的标题是“Albanië”,SEO 版本是“albanie”。只是为了兼容性而这样做。

      编辑:某些浏览器(例如 Google Chrome)可能会将 URL 中的 %C3%AB 转换为 ë 并返回。太糟糕了,发送到服务器的实际请求是带有%C3%AB 的请求。

      EG:您的浏览器显示:site.com/locations/Albanië

      服务器接收:GET locations/Albani%C3%AB

      【讨论】:

      • 我有两种语言。英语和荷兰语。当我经过奥尔巴尼。它采取英语。如果我只能通过 Albanië。我得到了正确的结果
      • 1.阿尔巴尼不是英国人。阿尔巴尼亚是英文名。 2.你应该抓住特殊字符并正确处理它们。我个人会尝试捕捉 (.*) 并使用 PHP 将 %C3%AB 转换为 ë。
      • 这个 (.*) 接受所有特殊字符。但我在这里使用 3 次有一些问题。我有很多困惑
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多