0

我正在尝试制定两个应该指向不同文件的重写规则。但是,它们以某种方式指向同一个 PHP 文件。

有人可以帮忙看看吗?


RewriteRule ^destinations/([a-z]+)-(.*)$ /a.php?x=$1&y=$2 [NC]

这应该与www.example.com/destination/us-united-state


RewriteRule ^destinations/([a-z]+)-(.+)-(.+)$ /b.php?a=$1&b=$2&c=$3 [NC]

这应该与www.example.com/destination/us-united-state-california

4

2 回答 2

0

us在and 和andunited-state之间使用其他分隔符。您无法检测到三个单独的单词实际上是两个还是三个“事物”。我建议使用斜杠作为分隔符:和.united-statecaliforniawww.example.com/destination/us-united-statewww.example.com/destination/us/united-statewww.example.com/destination/us/united-state/california

你的规则是:

RewriteRule ^destinations/([a-z]+)/([^/]+)/?$ /a.php?x=$1&y=$2 [NC]
RewriteRule ^destinations/([a-z]+)/([^/]+)/([^/]+)/?$ /b.php?a=$1&b=$2&c=$3 [NC]

这使用[^/]+,它匹配除/字符之外的任何内容。这可以防止捕获组匹配us/united-states应该只匹配的位置us。请注意,此代码未经测试,因为我无法在这台计算机上进行测试。

于 2013-08-09T06:11:05.347 回答
0

正则表达式找到最长的匹配项。因此,([a-z]+)-(.*)$将匹配一个或多个 a 到 z 字符,后跟一个破折号,然后是 ANYTHING。

([a-z]+)-(.+)-(.+)需要两个破折号,但上面的表达式也将匹配这些破折号。

确保您匹配正确数量的破折号:

RewriteRule ^destinations/([a-z]+)-([^-]+)$ /a.php?x=$1&y=$2 [NC]

并将页面重命名为

www.example.com/destination/us-unitedstate

然后

RewriteRule ^destinations/([a-z]+)-([^-]+)-([^-]+)$ /b.php?a=$1&b=$2&c=$3 [NC]

匹配页面

www.example.com/destination/us-unitedstate-california
于 2013-08-09T06:20:06.230 回答