regex - 使用 .htaccess 插入或更新查询参数

标签 regex apache .htaccess mod-rewrite

我希望对位于 www.mysite.com/nouveauSite/shop.html 的页面的每次访问都重定向到同一网址,并将 locale=fr 添加到查询字符串。

我可以看到 3 种类型的请求:

  1. 不带查询字符串的网址:/nouveauSite/shop.html 应重写为 /nouveauSite/shop.html?locale=fr
  2. 带有查询字符串但没有 locale 参数的网址:/nouveauSite/shop.html?foo=3 应重写为 /nouveauSite/shop。 html?locale=fr?foo=3
  3. 查询字符串包含设置为 fr 以外的 locale 参数的网址:/nouveauSite/shop.html?foo=3&locale=en 应重写为 /nouveauSite/shop.html?locale=fr&foo=3

现在我只有 2 号工作。 我正在使用这个规则:

RewriteCond %{QUERY_STRING} !locale=
RewriteRule ^shop.html     /nouveauSite/shop.html?locale=fr [R,L,QSA]

我认为这个规则:

RewriteCond %{REQUEST_URI} ^/nouveauSite/shop.html
RewriteRule ^shop.html     /nouveauSite/shop.html?locale=fr [R,L]

可以修复数字 1,但似乎不起作用。

我不知道如何处理第三个。

最佳答案

为此,您的 .htaccess 中需要 2 个重定向规则:

  1. 检查查询字符串中是否不存在 locale= 查询参数,然后简单添加 locale=frQSA 标志以保留原始值查询字符串。
  2. 更复杂的规则来检查 locale= 查询参数是否存在除 fr 值以外的任何内容,然后我们必须将其替换为 locale= fr

您可以使用以下 2 条重定向规则:

RewriteEngine On

# rule #1 when locale= doesn't exist
RewriteCond %{REQUEST_URI} ^/nouveauSite/shop\.html$ [NC]
RewriteCond %{QUERY_STRING} !(?:^|&)locale= [NC]
RewriteRule . %{REQUEST_URI}?locale=fr [R=302,L,QSA]

# rule #2 when locale= exists with anything other than fr
RewriteCond %{REQUEST_URI} ^/nouveauSite/shop\.html$ [NC]
RewriteCond %{QUERY_STRING} ^(.*&)?locale=(?!fr(?:&|$))[^&]*(?:&(.*))?$ [NC]
RewriteRule ^ %{REQUEST_URI}?%1locale=fr%2 [R=302,L]

出于测试目的,我在这些规则中保留了 R=302,您应该稍后将其更改为 R=301 以使其永久重定向。

使用上述规则的测试结果

curl -I 'localhost/nouveauSite/shop.html'
HTTP/1.1 302 Found
Date: Tue, 03 Nov 2020 05:38:12 GMT
Server: Apache/2.4.46 (Unix) OpenSSL/1.1.1h PHP/7.4.11
Location: http://localhost/nouveauSite/shop.html?locale=fr
Content-Type: text/html; charset=iso-8859-1


curl -I 'localhost/nouveauSite/shop.html?foo=3'
HTTP/1.1 302 Found
Date: Tue, 03 Nov 2020 05:38:40 GMT
Server: Apache/2.4.46 (Unix) OpenSSL/1.1.1h PHP/7.4.11
Location: http://localhost/nouveauSite/shop.html?locale=fr&foo=3
Content-Type: text/html; charset=iso-8859-1


curl -I 'localhost/nouveauSite/shop.html?foo=3&locale=en'
HTTP/1.1 302 Found
Date: Tue, 03 Nov 2020 05:40:22 GMT
Server: Apache/2.4.46 (Unix) OpenSSL/1.1.1h PHP/7.4.11
Location: http://localhost/nouveauSite/shop.html?foo=3&locale=fr
Content-Type: text/html; charset=iso-8859-1

关于regex - 使用 .htaccess 插入或更新查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64652190/

相关文章:

.htaccess - 重定向 - 总共 4 个参数

.htaccess - Htaccess 友好的 SEO 重写使图像停止加载?

regex - 根据 Bash 中的模式重命名目录

regex - 比较\s 和\t

apache - 如何在 dojo 中启用 CORS 以连接到 Openfire

java - tomcat中奇怪的IP地址

linux - 如果在 htaccess 中。想为不同的服务器使用不同的 include_path

apache - .htaccess 重写条件尾随斜杠仅适用于特定目录

c# - 查找所有包含 + 的字符

javascript - 需要帮助使用正则表达式使代码优雅