我有一个带有查询字符串的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
超全局数组。
一些重要说明:
我不想将用户从没有问号的网址重定向到带有问号的网址。
我对此页面都有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
中执行此操作?
答案 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