【问题标题】:Removing keyword from url with htaccess使用 htaccess 从 url 中删除关键字
【发布时间】:2016-01-14 13:28:19
【问题描述】:

我有以下网址:

http://www.domain.com/index.php?route=product/search&search=product%20keyword%20remove

我想使用 htaccess 从此网址中删除“关键字”。这是我到目前为止所拥有的,但没有按预期工作:

RewriteRule ^search=(.*?)keyword(.*?)$ search=$1$2 [L,R=301,NC]

我在这里做错了什么?另外,空格“%20”应该如何处理?因为至少还需要删除其中一个空格。

有多个 url 包含“关键字”,但是这个关键字之前和之后的单词可能会有所不同,所以这就是我尝试使用 (.*) 的原因

谢谢

【问题讨论】:

  • %20 url 字符串中的空格可以通过在正则表达式模式中使用 \s 来处理。
  • 我在这里做错了什么? - 您正在尝试匹配 RewriteRule 指令中的查询字符串,查询字符串无法在该指令中直接处理,您需要使用带有 %{QUERY_STRING} 的 RewriteCond。

标签: regex apache .htaccess mod-rewrite url-rewriting


【解决方案1】:

以下规则应该适合你:

RewriteEngine On

RewriteCond %{THE_REQUEST} \?(.*search=[^&]*)%20keyword(\S*)\sHTTP [NC]
RewriteRule ^ %{REQUEST_URI}?%1%2 [R=302,NE,L]

【讨论】:

  • 这仅适用于一个小的 mod RewriteCond %{THE_REQUEST} \?(.*search=[^&]*)%20keyword(\S*)\sHTTP [NC] ,添加在 % 20 也可以删除关键字前面的空格。
  • 是的,如果您也想删除%20,那么确实是:RewriteCond %{THE_REQUEST} \?(.*search=[^&]*)%20keyword(\S*)\sHTTP [NC]
【解决方案2】:

要匹配带有查询字符串的 url,您还可以使用 %{THE_REQUEST} 变量。

RewriteCond %{THE_REQUEST} search=(.*?)keyword(.*?) [NC]
RewriteRule ^ /index.php?route=product/search&search=%1%2 [L,R]

%n 是 RewriteCond 中正则表达式捕获组的一部分

【讨论】:

  • 这部分有效,这意味着它不会捕获关键字之后的部分,因此 url 只被重写到关键字,删除最后一部分。
  • 我试过这样: RewriteCond %{THE_REQUEST} search=(.*?)keyword\S(.*)$ [NC] 结果是 search=firstword%252020thirdword%20HTTP/1.0 。所以关键字被删除了,但是添加的 HTTP 部分是什么?
  • HTTP 1.0 是由于正则表达式的贪婪行为而附加的请求字符串的最后一部分,尝试添加 ?在 * 之后,(.*?) .
  • 选项 1:RewriteCond %{THE_REQUEST} search=(.*?)keyword(.*?)$ [NC] ,我仍然得到 HTTP 1.0 部分,选项 2:RewriteCond %{THE_REQUEST} search=(.*?)keyword(.*?) [NC] ,我只得到第一个单词,关键字后面的最后一部分丢失了。
  • @FlorinC。清除浏览器缓存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 2021-10-02
相关资源
最近更新 更多