我在子域中处理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]
我有两个问题。
我想在我的网址中传递特殊字符。
我已经尝试了(.*)
,但它遇到了很多问题。我想将特殊字符传递给([a-zA-Z0-9_-]+)
。
我的主要查询是我有一个网址。当我的链接转换为荷兰语。
网址:http://demo.osiztechnologies.com/carrental/Albanië
问题在于Albanië
。它显示404错误。如果我将其改为英语,它可以正常工作。
如何使用特殊字符重写URL?
答案 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