2

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

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

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

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

我想用 Apache 和 删除查询字符串中的问号htaccess,所以当用户看到我的网站时:

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

它将与此地址相同:

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

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

一些重要说明:

  1. 我不想将用户从不带问号的 URL 重定向到问号的URL

  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. 没有任何子文件夹。

我怎样才能做到这一点htaccess

4

1 回答 1

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
于 2012-12-11T06:12:44.693 回答