给定 URL
https://example.com/api/test/512/31
我想重写为:
https://example.com/api/test.php?param1=512¶m2=31
我试过了:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php?param1=$1¶m2=$2 [QSA,L]
重写成功了,但是$1
和$2
是空的。知道为什么吗?
答案1
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php?param1=$1¶m2=$2 [QSA,L]
您如何思考$1
并$2
做好准备?您尚未在RewriteRule
图案(这是一个否定模式,所以无论如何都不能“匹配”任何东西),所以$1
and$2
反向引用确实永远是空的。
由于您使用的是直接映射到文件的无扩展 URL,因此您还需要确保已禁用 MultiViews(如果尚未禁用)。如果已启用 MultiViews,那么您将获得相同的结果 - 没有 URL 参数 - 因为 mod_negotiation 会在 mod_rewrite 之前为文件发出内部子请求。
更新:
标准(来自评论):
- 您的
.htaccess
文件位于/api
子目录中。 /api/<something>
总是映射到/api/<something>.php
。<something>
可以由任意数量的路径段组成,例如different/anothersubfolder/filename
。/512/31
URL 末尾的路径段可以由数字和字母组成。路径段始终有两个,即/#1/#2
。
请尝试以下操作:
Options -MultiViews
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/api/$1.php -f
RewriteRule ^(.+)/(\w+)/(\w+)$ $1.php?param1=$2¶m2=$3 [QSA,L]
简写字符类\w
匹配a-z
、A-Z
和0-9
(_
下划线)。因此涵盖了“数字和字母”。