使用多个查询字符串重写规则

问题描述

我是 htaccess 的新手。我正在使用多个查询字符串的网站上工作。 我需要重写不同查询字符串的网址,如:

  1. /path_to_website/file.php?product=var1&country=0&pag=1 到 /path_to_website/var1/
  2. /path_to_website/file.php?product=var1&country=0&pag=var2 到 /path_to_website/var1/var2
  3. /path_to_website/file.php?product=var1&country=var2&pag=1 到 /path_to_website/var1/var2/
  4. /path_to_website/file.php?product=var1&country=var2&pag=var3 到 /path_to_website/var1/var2/var3

如您所见,问题是在 2 到 3 次重写之间,因为它们具有相同数量的参数(如果问题是这个)。我在 htaccess 文件上做了这个:

###BLOCK 1#######

RewriteCond %{QUERY_STRING} ^$

RewriteRule ^([^/]+)/$ /path_to_website/modules/file.php?product=$1&country=0&pag=1&rew=1 [L]

RewriteCond %{QUERY_STRING} ^(.*)=(.*)&country=0&pag=1$

RewriteCond %{QUERY_STRING} !^.*rew=1.*$

RewriteRule ^.*$ /path_to_website/%2/? [R=301,L]

###BLOCK 2#######

RewriteCond %{QUERY_STRING} ^$

RewriteRule ^([^/]+)/([^/]+)/$ /path_to_website/modules/file.php?product=$1&country=0&pag=$2&rew=1 [L]

RewriteCond %{QUERY_STRING} ^(.*)=(.*)&country=0&(.*)=(.*)$

RewriteCond %{QUERY_STRING} !^.*rew=1.*$

RewriteRule ^.*$ /path_to_website/%2/%4/? [R=301,L]

###BLOCK 3#######

RewriteCond %{QUERY_STRING} ^$

RewriteRule ^([^/]+)/([^/]+)/$ /path_to_website/modules/file.php?product=$1&country=$2&pag=1&rew=1 [L]

RewriteCond %{QUERY_STRING} ^(.*)=(.*)&(.*)=(.*)&pag=1$

RewriteCond %{QUERY_STRING} !^.*rew=1.*$

RewriteRule ^.*$ /path_to_website/%2/%4/? [R=301,L]

###BLOCK 4#######

RewriteCond %{QUERY_STRING} ^$

RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ /path_to_website/modules/file.php?product=$1&country=$2&pag=$3&rew=1 [L]

RewriteCond %{QUERY_STRING} ^(.*)=(.*)&(.*)=(.*)&(.*)=(.*)$

RewriteCond %{QUERY_STRING} !^.*rew=1.*$

RewriteRule ^.*$ /path_to_website/%2/%4/%6/? [R=301,L]

我该如何解决这个问题?因为除了我搜索产品和国家/地区 !=0 之外,一切都正常,引擎在块 2 处停止。

请有人帮助我,因为我被这个问题困住了。

非常感谢!

编辑

感谢@RavinderSingh13 的回答。我试过你的规则,就像这样:

RewriteCond %{QUERY_STRING} ^$
############your rule###########
RewriteRule ^([\w-]+)/?$ file.php?product=$1&country=0&pag=1 [L]
RewriteCond %{QUERY_STRING} ^(.*)=(.*)&country=0&pag=1$
RewriteRule ^.*$ /path_to_website/%2/? [R=301,L]

使用此规则重写为 path_to_website/product/,但该页面不适用于“ERR_TOO_MANY_REDIRECTS”。我也只尝试过你的规则:

RewriteRule ^([\w-]+)/?$ file.php?product=$1&country=0&pag=1 [L]

在这种情况下,重写根本不起作用,只是打印查询字符串。我也尝试过使用 rew=1 键,如下所示:

RewriteCond %{QUERY_STRING} ^$
RewriteRule ^([\w-]+)/?$ /aziende_agrarie/modules/risultato_ricerca.php? 
prodotto=$1&provincia=0&pag=1&rew=1 [L]
RewriteCond %{QUERY_STRING} ^(.*)=(.*)&provincia=0&pag=1$
RewriteCond %{QUERY_STRING} !^.*rew=1.*$
RewriteRule ^.*$ /aziende_agrarie/%2/? [R=301,L]

重写适用于 path_to_website/product,但是当我在 2 上更改页面时,浏览器 url 是 path_to_website/product/?product=var1&country=0&pag=2。所以我插入了 product/2/ 的重写,“file.php?product=var1&country=0&pag=var2”的重写是:

RewriteCond %{QUERY_STRING} ^$
RewriteRule ^([\w-]+)/([\w-]+)(?!=/)$ /aziende_agrarie/modules/risultato_ricerca.php? 
prodotto=$1&provincia=0&pag=$2&rew=1 [L]
RewriteCond %{QUERY_STRING} ^(.*)=(.*)&provincia=0&(.*)=(.*)$
RewriteCond %{QUERY_STRING} !^.*rew=1.*$
RewriteRule ^.*$ /aziende_agrarie/%2/%4/? [R=301,L]

等等。我想念什么?非常感谢您的帮助:)

解决方法

根据您显示的示例,您能否尝试遵循 .htaccess 文件中的规则集。另外,请确保在测试 URL 之前清除缓存。

RewriteEngine ON
##For file.php?product=var1&country=0&pag=1
RewriteRule ^([\w-]+)/?$ file.php?product=$1&country=0&pag=1 [L]

##For file.php?product=var1&country=0&pag=var2
RewriteRule ^([\w-]+)/([\w-]+)(?!=/)$ file.php?product=$1&country=0&pag=$2 [L]

##For file.php?product=var1&country=var2&pag=1
RewriteRule ^([\w-]+)/([\w-]+)/$ file.php?product=$1&country=$2&pag=1 [L]

##for file.php?product=var1&country=var2&pag=var3
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)$ file.php?product=$1&country=$2&pag=$3 [L]

编辑

我有一个带有表单提交和带有自定义分页器的 href 的 GET 请求。我解决了这个问题。问题出在 href 上,因为我将查询字符串保留为“path_to_website/?product=var1&country=var2&page=1”等。我解决了将 pag1 的查询字符串 href 替换为“/product/country”等其他 href 的问题.在提交事件中,我留下了我的自定义块 1 和块 3 规则,对于分页器 href 我写了你的重写规则。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...