$_GET 变量为空 .htaccess 重写

$_GET 变量为空 .htaccess 重写

给定 URL

https://example.com/api/test/512/31

我想重写为:

https://example.com/api/test.php?param1=512&param2=31

我试过了:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php?param1=$1&param2=$2 [QSA,L]

重写成功了,但是$1$2是空的。知道为什么吗?

答案1

RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php?param1=$1&param2=$2 [QSA,L]

您如何思考$1$2做好准备?您尚未在RewriteRule 图案(这是一个否定模式,所以无论如何都不能“匹配”任何东西),所以$1and$2 反向引用确实永远是空的。

由于您使用的是直接映射到文件的无扩展 URL,因此您还需要确保已禁用 MultiViews(如果尚未禁用)。如果已启用 MultiViews,那么您将获得相同的结果 - 没有 URL 参数 - 因为 mod_negotiation 会在 mod_rewrite 之前为文件发出内部子请求。

更新:

标准(来自评论):

  • 您的.htaccess文件位于/api子目录中。
  • /api/<something>总是映射到/api/<something>.php<something>可以由任意数量的路径段组成,例如different/anothersubfolder/filename
  • /512/31URL 末尾的路径段可以由数字和字母组成。路径段始终有两个,即/#1/#2

请尝试以下操作:

Options -MultiViews

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/api/$1.php -f
RewriteRule ^(.+)/(\w+)/(\w+)$ $1.php?param1=$2&param2=$3 [QSA,L]

简写字符类\w匹配a-zA-Z0-9_下划线)。因此涵盖了“数字和字母”。

相关内容