使用多个查询字符串重写规则
Rewrite rules with multiple query string
我是 htaccess 的新手。我在一个有多个查询字符串的网站上工作。
我需要重写 urls 不同的查询字符串,例如:
- /path_to_website/file.php?product=var1&country=0&pag=1 到 /path_to_website/var1/
- /path_to_website/file.php?product=var1&country=0&pag=var2 到 /path_to_website/var1/var2
- /path_to_website/file.php?product=var1&country=var2&pag=1 到 /path_to_website/var1/var2/
- /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=&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=&country=0&pag=&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=&country=&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=&country=&pag=&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=&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=&country=0&pag=1 [L]
在这种情况下,重写根本不起作用,只是打印查询字符串。我也试过使用 rew=1 键,像这样:
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^([\w-]+)/?$ /aziende_agrarie/modules/risultato_ricerca.php?
prodotto=&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=&provincia=0&pag=&rew=1 [L]
RewriteCond %{QUERY_STRING} ^(.*)=(.*)&provincia=0&(.*)=(.*)$
RewriteCond %{QUERY_STRING} !^.*rew=1.*$
RewriteRule ^.*$ /aziende_agrarie/%2/%4/? [R=301,L]
等等。我错过了什么?非常感谢您的帮助:)
根据您显示的示例,您能否尝试遵循 .htaccess 文件中的规则集。另外,请确保在测试您的网址之前清除缓存。
RewriteEngine ON
##For file.php?product=var1&country=0&pag=1
RewriteRule ^([\w-]+)/?$ file.php?product=&country=0&pag=1 [L]
##For file.php?product=var1&country=0&pag=var2
RewriteRule ^([\w-]+)/([\w-]+)(?!=/)$ file.php?product=&country=0&pag= [L]
##For file.php?product=var1&country=var2&pag=1
RewriteRule ^([\w-]+)/([\w-]+)/$ file.php?product=&country=&pag=1 [L]
##for file.php?product=var1&country=var2&pag=var3
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)$ file.php?product=&country=&pag= [L]
编辑
我有一个带有自定义分页器的表单提交和 href 的 GET 请求。我解决了这个问题。问题出在 href 上,因为我留下了查询字符串,如“path_to_website/?product=var1&country=var2&page=1”等。我解决了这个问题,将查询字符串 href 替换为 pag1 的“/product/country”等关于其他 href。在提交事件中,我留下了我的自定义块 1 和块 3 规则,对于分页器 href,我写了你的重写规则。
我是 htaccess 的新手。我在一个有多个查询字符串的网站上工作。 我需要重写 urls 不同的查询字符串,例如:
- /path_to_website/file.php?product=var1&country=0&pag=1 到 /path_to_website/var1/
- /path_to_website/file.php?product=var1&country=0&pag=var2 到 /path_to_website/var1/var2
- /path_to_website/file.php?product=var1&country=var2&pag=1 到 /path_to_website/var1/var2/
- /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=&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=&country=0&pag=&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=&country=&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=&country=&pag=&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=&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=&country=0&pag=1 [L]
在这种情况下,重写根本不起作用,只是打印查询字符串。我也试过使用 rew=1 键,像这样:
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^([\w-]+)/?$ /aziende_agrarie/modules/risultato_ricerca.php?
prodotto=&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=&provincia=0&pag=&rew=1 [L]
RewriteCond %{QUERY_STRING} ^(.*)=(.*)&provincia=0&(.*)=(.*)$
RewriteCond %{QUERY_STRING} !^.*rew=1.*$
RewriteRule ^.*$ /aziende_agrarie/%2/%4/? [R=301,L]
等等。我错过了什么?非常感谢您的帮助:)
根据您显示的示例,您能否尝试遵循 .htaccess 文件中的规则集。另外,请确保在测试您的网址之前清除缓存。
RewriteEngine ON
##For file.php?product=var1&country=0&pag=1
RewriteRule ^([\w-]+)/?$ file.php?product=&country=0&pag=1 [L]
##For file.php?product=var1&country=0&pag=var2
RewriteRule ^([\w-]+)/([\w-]+)(?!=/)$ file.php?product=&country=0&pag= [L]
##For file.php?product=var1&country=var2&pag=1
RewriteRule ^([\w-]+)/([\w-]+)/$ file.php?product=&country=&pag=1 [L]
##for file.php?product=var1&country=var2&pag=var3
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)$ file.php?product=&country=&pag= [L]
编辑
我有一个带有自定义分页器的表单提交和 href 的 GET 请求。我解决了这个问题。问题出在 href 上,因为我留下了查询字符串,如“path_to_website/?product=var1&country=var2&page=1”等。我解决了这个问题,将查询字符串 href 替换为 pag1 的“/product/country”等关于其他 href。在提交事件中,我留下了我的自定义块 1 和块 3 规则,对于分页器 href,我写了你的重写规则。