0

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

4

2 回答 2

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]
于 2013-08-27T14:43:04.583 回答
0

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

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

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

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

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

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

于 2013-08-27T13:23:09.313 回答