apache .htaccess将最后五个目录重写为GET值

mepcadol  于 2023-01-14  发布在  Apache
关注(0)|答案(1)|浏览(125)

我有以下网址:
https://sub.example.com/economy/billing/payment-check/434/khipu/1000/CLP/1673526088/
我希望最后5个目录转换为GET值,以反映以下URL:
https://sub.example.com/economy/billing/payment-check/?id=434&gateway=khipu&amt=1000&curr=CLP&ts_ttPageLoad=1673526088
我有以下.htaccess行:

RewriteEngine on
RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)/ index.php?id=$1&gateway=$2&amt=$3&curr=$4&ts_ttPageLoad=$5 [QSA,L]

https://htaccess.madewithlove.com/上,我得到了以下重写结果:
https://sub.example.com/index.php?id=economy/billing/payment-check/434&gateway=khipu&amt=1000&curr=CLP&ts_ttPageLoad=1673526088
我做错什么了?谢谢!
编辑:.htaccess位于https://sub.example.com/economy/billing/payment-check/

ergxz8rk

ergxz8rk1#

正则表达式限定符*默认为 greedy,因此尽可能多地消耗,然后根据需要回溯。这就是$1包含economy/billing/payment-check/434的原因(即尽可能多地满足正则表达式)。尽管,这是假设.htaccess文件在文档根中(这是“MWL测试器”所假设的)。
如果您只想匹配单个路径段,则从捕获子模式中排除斜线,例如([^/]+)
另外,根据规则的性质,我假设这个.htaccess文件位于/economy/billing/payment-check/子目录中(不是根目录)?“MWL测试器”工具假定.htaccess文件位于文档根目录中(而且这是不能改变的)。事实上,如果X1 M8 N1 X文件位于子目录中,这将在您的服务器上“工作”,然而,这并不是最优的,因为在URL结构中给定变化的情况下,它仍然可能潜在地匹配太多。
如果.htaccess文件位于/economy/billing/payment-check/.htaccess,则使用以下命令:

RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ index.php?id=$1&gateway=$2&amt=$3&curr=$4&ts_ttPageLoad=$5 [QSA,L]

正则表达式[^/]+匹配除斜杠以外的内容。
但是,如果规则在根.htaccess文件中(MWL测试人员所期望的),则规则需要如下所示:

RewriteRule ^(economy/billing/payment-check)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ $1/index.php?id=$2&gateway=$3&amt=$4&curr=$5&ts_ttPageLoad=$6 [QSA,L]

注意,第一个捕获子模式现在是URL-path,它在 substitution 字符串(第二个参数)中重复出现,这样就避免了在第二个参数中手动重复URL-path。
看起来你的URL在路径段中需要特定的数据类型。例如,第一、第三和第五个“参数”看起来只有数字。如果是这种情况,那么你应该是特定的,只匹配数字。同样,第四个“参数”是大写字母,第二个是小写字母。所以,特定的,可以如下重写(子目录中包含.htaccess文件):

RewriteRule ^(\d+)/([a-z]+)/(\d+)/([A-Z]+)/(\d+)/$ index.php?id=$1&gateway=$2&amt=$3&curr=$4&ts_ttPageLoad=$5 [QSA,L]

然后它只匹配您期望的URL的 * 格式 *。

相关问题