Apache 使用路径和查询字符串将包含目录路径和参数的URL重写为基于参数的URL

Apache 使用路径和查询字符串将包含目录路径和参数的URL重写为基于参数的URL,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我使用htaccess重写此路径: /inventory/products/tools/ 使用查询字符串连接到此url: /inventory.php?cat=products&type=tools 使用以下规则: RewriteRule ^inventory/(.*)/(.*)/? /inventory.php?cat=$1&type=$2 [L,R=301] 当我向url路径添加查询字符串时 /inventory/products/tools/?sort=pricehi

我使用htaccess重写此路径:

/inventory/products/tools/
使用查询字符串连接到此url:

/inventory.php?cat=products&type=tools
使用以下规则:

RewriteRule ^inventory/(.*)/(.*)/? /inventory.php?cat=$1&type=$2 [L,R=301]
当我向url路径添加查询字符串时

/inventory/products/tools/?sort=pricehigh
使用这个规则

RewriteCond %{QUERY_STRING} ^(.*)$ [NC]
RewriteRule ^inventory/(.*)/(.*)/? /inventory.php?cat=$1&type=$2&%1 [L,R=301]
我得到一个重定向循环,URL字符串被一遍又一遍地重写

我试图以以下目标url结束

/inventory.php?cat=products&type=tools&sort=pricehigh
在上面的示例规则中,我使用R=301来可视化url。
在生产中,我只使用[L]而不使用尾随斜杠,第二个
(.*)
也允许匹配零字符-因此由于正则表达式的贪婪性,第一个
(.*)
已经匹配了
产品/工具

以下方面应起作用:

RewriteRule ^inventory/([^/]+)/([^/]+)/?$ /inventory.php?cat=$1&type=$2 [QSA,L,R=302,NE]
([^/]+)
要求在包含除
/
以外的所有内容的字符类中使用一个或多个字符


由于某些原因,
NE
/
noescape
标志在这里似乎是必要的,否则生成的查询字符串将包含
?cat=products%26type=…
,并对
&
URL进行编码。

您不需要检查查询字符串是否包含任何内容,请删除该条件。使用
QSA
标志将原始查询字符串与您创建的新查询字符串合并。(“我使用R=301以可视化url”-302会更好;使用301时,浏览器可能会缓存重定向,因此如果您在更改重写后再次测试,您可能很容易被仍然保留“旧”结果所蒙蔽。)/inventory/product/tools/?sort=pricehigh RewriteRule^inventory/(*)/(*)/(*)//inventory.php?cat=$1&type=$2[QSA,L,R=302]使用QSA确实会添加QS,但会导致产品和工具/inventory.php?cat=product/tools&type=&sort=pricehighAh的串联,好的。没有尾随斜杠,第二个
(.*)
也允许匹配零字符-因此由于正则表达式的贪婪性,第一个
(.*)
已经匹配了
产品/工具。尝试在两个位置将
*
更改为
+
,要求在这些位置至少有一个字符。
重写规则^inventory/([^/]+)/([^/]+)/?$/inventory.php?cat=$1&type=$2[QSA,L,R=302,NE]
至少应该可以工作,但这并不总是一个完美的指标不确定为什么它似乎需要
NE
标志tbh。-但是如果没有它,我会得到
?cat=products%26type=…
,在结果中,
&
会出于某种原因应用URL编码。