【问题标题】:inserting or updating a query parameter with .htaccess使用 .htaccess 插入或更新查询参数
【发布时间】:2020-11-02 19:35:54
【问题描述】:

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

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

  1. 没有查询字符串的 URL:/nouveauSite/shop.html 应重写为 /nouveauSite/shop.html?locale=fr
  2. 带有查询字符串但没有locale 参数的网址:/nouveauSite/shop.html?foo=3 应重写为/nouveauSite/shop.html?locale=fr?foo=3
  3. 查询字符串包含locale 参数设置为fr 以外的其他内容的URL:/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,但它似乎不起作用。

我不知道3号该怎么办。

【问题讨论】:

  • 澄清一下,您的.htaccess 文件似乎位于/nouveauSite 子目录中? /shop.html?locale=fr?foo=3 - 我猜你的意思是/shop.html?locale=fr&foo=3?您的第一条规则应该对#1 和#2 “有效”,因为它们实际上是一回事,即。没有locale 参数。只有 #3 是一种特殊情况,但取决于您的应用程序如何读取“重复”参数,那么所有 3 个都可以由单个规则处理。你的.htaccess 文件中还有其他指令吗?您如何阅读这些 URL 参数?

标签: regex apache .htaccess mod-rewrite


【解决方案1】:

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

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

你可以有这两个重定向规则:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 2017-08-15
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    相关资源
    最近更新 更多