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

Php 使用apache和htaccess从查询字符串中删除问号,php,apache,.htaccess,Php,Apache,.htaccess,我有一个带有querystring的PHP页面: http://project.dev/?a=b&c=d 如您所知,我可以使用$\u GET超全局数组访问查询字符串: print_r($_GET); /* Array ( [a] => b [c] => d ) */ 我想使用Apache和htaccess从querystring中删除问号,因此当用户看到我的网站时,请使用此地址: http://project.dev/a=b&c=d http:/

我有一个带有querystring的PHP页面:

http://project.dev/?a=b&c=d
如您所知,我可以使用
$\u GET
超全局数组访问查询字符串:

print_r($_GET);
/*
Array
(
    [a] => b
    [c] => d
)
*/
我想使用Apache和
htaccess
从querystring中删除问号,因此当用户看到我的网站时,请使用此地址:

http://project.dev/a=b&c=d
http://project.dev/?a=b&c=d
它将与此地址相同:

http://project.dev/a=b&c=d
http://project.dev/?a=b&c=d
我可以像以前一样访问查询字符串:使用
$\u GET
超全局数组

一些重要注意事项:

  • 我不想将用户从没有问号的URL重定向到带有问号的URL

  • 我有
    GET
    POST
    请求进入此页面

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

  • 我想要带问号的地址,自动重定向到不带问号的地址。例如,当用户使用以下地址访问我的网站:
    http://project.dev/?a=b&c=d

    我想将用户重定向到此地址:
    http://project.dev/a=b&c=d

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

  • 如何在
    htaccess
    中执行此操作

    我有获取和发布此页面的请求

    这可能是一个问题,因为重定向后不会包含请求主体。因此,如果您发布的请求在查询字符串中包含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
    ,而不是正在编码的
    %
    。您也可以尝试用
    -f
    -d
    检查替换
    RewriteCond%{REQUEST\u URI}.=.

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

    谢谢你的回复。不幸的是,它不起作用。我运行的是
    Apache/2.4.3(Win32)OpenSSL/1.0.1c PHP/5.4.7
    @Mojtaba“它不起作用”不会告诉我太多,如果这就是我要说的,那么我就不能再帮你了。对不起,Jon Lin,这些规则有效。我正在使用XAMPP在windows上运行PHP,我在htdocs中创建了一个名为
    querystring
    的文件夹,并将两个文件放在那里:
    .htaccess
    index.PHP
    。在
    .htaccess
    中,我编写了您的代码,当我转到此地址时
    http://localhost/querystring/?a
    我的页面工作正常并显示查询字符串。但是当我想访问没有问号的页面时,
    http://localhost/querystring/a
    ,它给出了错误404。它要转到名为
    a
    的文件夹。我测试了我的
    .htaccess
    。我在上面写了一些非法代码,我的页面出现了错误500。我在这里为您提供更多信息:)@Mojtaba您的示例将请求转到文档根目录,如果您的请求都转到另一个目录(如
    querystring
    ),那么这些规则将不起作用,因为所有内容都是专门为文档根目录编写的。这些规则是不可移植的。它们必须位于文档根目录中。如果要将
    index.php
    放在名为
    querystring
    的目录中,则需要在第一个条件中将
    ^(GET | HEAD)\/\?
    替换为
    ^(GET | HEAD)\/querystring/\?
    并将规则
    /%2?
    替换为
    /querystring/%2?
    。我将文件移动到文档根目录。但它失败了。我仍然得到错误404。这是否与我的Apache版本有关?