在php中获取重写URL的浏览器URL

时间:2014-09-01 16:54:56

标签: php web-services mod-rewrite asp.net-web-api restful-url

我编写了一个使用以下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控制器中的查询字符串?

注意:示例中已更改了实际网址。

1 个答案:

答案 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>