Php 使用apache和htaccess从查询字符串中删除问号
我有一个带有querystring的PHP页面: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:/
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
超全局数组
一些重要注意事项:
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版本有关?