nginx 重写,无需 URL 解码

nginx 重写,无需 URL 解码

我在我的 nginx 服务器上使用重写来允许https://www.example.com/en/product/apple.html传递诸如和之类的 URL en,如下所示:productapple.html

rewrite ^/([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_\-]+)/(.+)$ /index.php?lang=$1&page=$2&part=$3&$query_string last;

如您所见,第三部分(在本例中为apple.html)将匹配任何字符。当此部分包含 URL 编码的特殊字符时,nginx 似乎会即时对其进行解码,PHP 将无法检测用户输入的 URL 是编码字符还是解码字符。例如:/en/product/apples,oranges.html/en/product/apples%2Coranges.html,PHP 会apples,oranges.html在这两种情况下读取。

为了避免出现 2 个内容相同的 URL:nginx 是否可以在不解码 URL 编码的特殊/保留字符的情况下重写 URL,以便 PHP 可以确定是否应重定向到非编码 URL?或者,也许更好的是,可以将其配置为 301 重定向/en/product/apples%2Coranges.html/en/product/apples,oranges.html

附言:我知道更好的 URL 应该是/en/product/apples-oranges.html忽略逗号。但由于网络允许我们使用逗号等特殊字符来组成 URL,因此我很想了解如何处理它们。

相关内容