使用apache和htaccess从查询字符串中删除问号

时间:2012-12-11 03:47:03

标签: php apache .htaccess

我有一个带有查询字符串的PHP页面:

http://project.dev/?a=b&c=d

如您所知,我可以使用$_GET超全局数组访问查询字符串:

print_r($_GET);
/*
Array
(
    [a] => b
    [c] => d
)
*/

我想要使用Apache和htaccess从querystring中删除questionmark,所以当用户看到我的网站时会显示以下地址:

http://project.dev/a=b&c=d

它与此地址相同:

http://project.dev/?a=b&c=d

我可以像以前一样访问查询字符串:使用$_GET超全局数组。

一些重要说明:

  1. 我不想将用户从没有问号的网址重定向到带有问号的网址

  2. 我对此页面都有GETPOST个请求。

  3. 查询字符串可以拥有问号?本身,例如:
    http://project.dev/?a=b&c=d?x=y

  4. 我希望地址带有问号,自动重定向到没有问号的地址。例如,当用户使用此地址访问我的网站时:
    http://project.dev/?a=b&c=d
    我想将用户重定向到此地址:
    http://project.dev/a=b&c=d

  5. 我的网站只有一页:index.php。没有任何子文件夹。

  6. 我如何在htaccess中执行此操作?

1 个答案:

答案 0 :(得分:1)

  

我对此页面都有GET和POST请求。

这可能是一个问题,因为重定向后请求正文不会包含在内。因此,如果您在查询字符串中发布了具有GET样式参数的请求,则重定向将丢失POST参数。

您想要的规则可能如下所示:

# Redirects query string to non-query string

RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /\?([^\ ]+)
RewriteRule ^ /%2? [L,R,NE]

# And back

RewriteCond %{REQUEST_URI} .=.
RewriteRule ^/?(.*)$ /?$1 [L]

如果您想要301重定向,请将第一个规则中的R标记替换为R=301。需要NE标记,查询字符串中的任何编码?都显示为%3F,而不是%自身编码。您也可以尝试使用RewriteCond %{REQUEST_URI} .=.-f支票替换-d

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d