我编写了一个使用以下apache mod重写规则的restful api:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /api
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ https://example.com/api/index.php?request=$1 [L]
</IfModule>
但是,在控制器中,我发现我无法正确获取查询字符串。
当我向https://example.com/api/search/article?mh=7发出获取请求后尝试获取查询字符串时:(1)
$_SERVER['QUERY_STRING']
我得到了以下结果:
request=search/article
当我尝试以下内容时:(2)
$_SERVER['REQUEST_URI']
我得到了以下结果:
/api/index.php?request=search/article
我可以做些什么来适当使用mod重写并成功获取我的api控制器中的查询字符串?
注意:示例中已更改了实际网址。
答案 0 :(得分:1)
假设您的htaccess位于/api/
文件夹中,它应该如下所示
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /api/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?request=$1 [L,QSA]
</IfModule>
注意:请勿在规则中使用http://
,否则将成为外部重定向。此外,使用QSA
标志从初始URL追加查询字符串。
从您的示例中:https://example.com/api/search/article?mh=7
将被重写为/api/index.php?request=search/article&mh=7
编辑:如果您希望API的每个http
网址重定向到https
等效
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /api/
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/api/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?request=$1 [L,QSA]
</IfModule>