我有以下网址:
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=&gateway=&amt=&curr=&ts_ttPageLoad= [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/
P粉3846792662024-01-17 13:06:03
正则表达式量词 *
默认情况下是贪婪,因此会消耗尽可能多的内容,然后根据需要回溯。这就是为什么 $1
包含 economy/billing/ payment-check/434
(即尽可能满足正则表达式)。尽管如此,这是假设 .htaccess
文件位于文档根目录中(这是“MWL 测试器”所假设的)。
如果您只想匹配单个路径段,则从捕获子模式中排除斜杠,例如。 ([^/]+)
.
此外,根据您的规则的性质,我假设此 .htaccess
文件位于 /economy/billing/ payment-check/
子目录中(而不是根)? “MWL tester”工具假定 .htaccess
文件位于文档根目录中(并且无法更改)。事实上,如果 .htaccess
文件位于子目录中,这将在您的服务器上“工作”,但是,这并不是最佳选择,因为考虑到 URL 的变化,它仍然可能匹配太多结构。
如果 .htaccess
文件位于 /economy/billing/ payment-check/.htaccess
,则使用以下内容:
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ index.php?id=&gateway=&amt=&curr=&ts_ttPageLoad= [QSA,L]
正则表达式 [^/]+
匹配除斜杠之外的内容。
但是,如果规则位于根 .htaccess
文件中(MWL 测试人员期望的),则规则需要如下所示:
RewriteRule ^(economy/billing/payment-check)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ /index.php?id=&gateway=&amt=&curr=&ts_ttPageLoad= [QSA,L]
请注意,第一个捕获子模式现在是 URL 路径,它在替换字符串(第二个参数)中重复。这只是避免了在第二个参数中手动重复 URL 路径。
您的 URL 似乎需要路径段中的特定数据类型。例如,第一个、第三个和第五个“参数”看起来只是数字。如果是这种情况,那么您应该具体并仅匹配数字。同样,第四个“param”是大写字母,第二个是小写字母。因此,具体而言,可以像这样重写(使用子目录中的 .htaccess 文件):
RewriteRule ^(\d+)/([a-z]+)/(\d+)/([A-Z]+)/(\d+)/$ index.php?id=&gateway=&amt=&curr=&ts_ttPageLoad= [QSA,L]
它只会匹配您期望的网址格式。