我希望对位于 www.mysite.com/nouveauSite/shop.html
的页面的每次访问都重定向到同一网址,并将 locale=fr 添加到查询字符串。
我可以看到 3 种类型的请求:
- 不带查询字符串的网址:
/nouveauSite/shop.html
应重写为/nouveauSite/shop.html?locale=fr
- 带有查询字符串但没有
locale
参数的网址:/nouveauSite/shop.html?foo=3
应重写为/nouveauSite/shop。 html?locale=fr?foo=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 个重定向规则:
- 检查查询字符串中是否不存在
locale=
查询参数,然后简单添加locale=fr
和QSA
标志以保留原始值查询字符串。 - 更复杂的规则来检查
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/