Heim > Fragen und Antworten > Hauptteil
Ich habe die folgende URL:
https://sub.example.com/economy/billing/ payment-check/434/khipu/1000/CLP/1673526088/
Ich möchte die letzten 5 Verzeichnisse in GET-Werte umwandeln, um die folgende URL wiederzugeben:
https://sub.example.com/economy/billing/ payment-check/?id=434&gateway=khipu&amt=1000&curr=CLP&ts_ttPageLoad=1673526088
Ich habe die folgenden .htaccess-Zeilen:
RewriteEngine on RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)/ index.php?id=&gateway=&amt=&curr=&ts_ttPageLoad= [QSA,L]
Auf https://htaccess.madewithlove.com/ erhalte ich die folgenden Umschreibeergebnisse:
https://sub.example.com/index.php?id=economy/billing/ payment-check/434&gateway=khipu&amt=1000&curr=CLP&ts_ttPageLoad=1673526088
Was habe ich falsch gemacht? Danke!
Bearbeiten: .htaccess unter 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=$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 路径,它在替换字符串(第二个参数)中重复。这只是避免了在第二个参数中手动重复 URL 路径。
您的 URL 似乎需要路径段中的特定数据类型。例如,第一个、第三个和第五个“参数”看起来只是数字。如果是这种情况,那么您应该具体并仅匹配数字。同样,第四个“param”是大写字母,第二个是小写字母。因此,具体而言,可以像这样重写(使用子目录中的 .htaccess 文件):
RewriteRule ^(\d+)/([a-z]+)/(\d+)/([A-Z]+)/(\d+)/$ index.php?id=$1&gateway=$2&amt=$3&curr=$4&ts_ttPageLoad=$5 [QSA,L]
它只会匹配您期望的网址格式。