htaccess url用荷兰语和英语重写

时间:2013-08-27 12:59:54

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

我在子域中处理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]

我有两个问题。

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

  2. 我的主要查询是我有一个网址。当我的链接转换为荷兰语。 网址:http://demo.osiztechnologies.com/carrental/Albanië

  3. 问题在于Albanië。它显示404错误。如果我将其改为英语,它可以正常工作。

    如何使用特殊字符重写URL?

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

那不行。您需要使用特殊字符(在这种情况下为%C3%AB)替换它们才能工作。

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

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

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

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

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