我正在尝试使用mod_rewrite重写一些URL,但是我从两个类似的规则得到了不同的结果。这是我的代码:
第一条规则:
RewriteEngine On
RewriteBase /
RewriteRule ^api/(.*?)$ index.php?p=$1 [L]
输入 example.com/api/test1/test2/test3 后,我在PHP中获得以下输出:
Array ( [p] => test1/test2/test3 )
第二条规则:
RewriteEngine On
RewriteBase /
RewriteRule ^/(.*?)$ index.php?p=$1 [L]
或
RewriteRule ^(.*?)$ index.php?p=$1 [L] #test
输入 example.com/test1/test2/test3 后,我在PHP中获得以下输出:
Array ( [p] => index.php )
这不是我的预期,我认为[p] => test1/test2/test3
与第一条规则相似。我该怎么做才能使结果一致?
提前致谢。
答案 0 :(得分:0)
你的第二条规则,
RewriteRule ^(.*?)$ index.php?p=$1 [L]
包含一个与您要重写的内容匹配的测试模式(index.php)。在 / test1 / test2 / test3 初始重写为 index.php?p = test1 / test2 / test3 之后,执行另一次转换 index.php的重写(使用 p = test1 / test2 / test3 查询字符串)到 index.php?p = index.php 。
您应该调整规则,以便不执行第二次重写。一种方法是查看请求的目标是否存在:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ index.php?p=$0