2013-06-02 329 views
2

我想从url中删除查询字符串。查询字符串隐藏

For eg: localhost/index.php?page=value to localhost/index.php 

我目前正在使用:

RewriteEngine On 
RewriteCond %{REQUEST_URI} !^/index.php$ 
RewriteRule ^(.+)\.php$ /$1/? [R=301,L] 
RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?page=$1 [L] 

它不改写 ... 什么我做错了吗?

编辑

删除QSL通过克莱夫

+1

QSA代表查询字符串追加... – Clive

+0

URL的查询字符串部分不能被改写,它会被添加到无论你做什么,重写的URL的新查询字符串。 URL重写意味着反过来工作。 – Alasdair

+1

@Alasdair:这只是部分真实的,如果你在'?'中进行重写,它应该删除查询字符串。有关详细信息,请参阅此博客文章:http://www.simonecarletti.com/blog/2009/01/apache-rewriterule-and-query-string/ – Wolph

回答

2

评论这里我们重写原始请求将自己与一个空的查询字符串,如果查询字符串是不是空的。

RewriteEngine On 
RewriteCond %{QUERY_STRING} !^$ 
RewriteRule ^(.*)$ $1? 

这已经包括了Apache,虽然与[QSD] Query String Discard

RewriteRule ^(.*)$ $1 [QSD] 

注:查询字符串允许你跟踪各种各样的东西在日志文件中,并从外部来源的链接。这样做会限制这些选项。

这可能不是你想要做的(通过这种方式失去了很多旧的链接)。所以,以下是如何将旧的查询字符串重定向到新的URL作为301重定向。这对于那些不熟悉RegEx或者Apache工作方式的人来说会有点混淆。在字符串的第一部分以问号结束意味着“也许是前面的字符”。在这种情况下,我们在替换结束时添加了?(不是REGEX模式),因为根据Apache manual for the QSD flag,Apache的默认行为类似于[QSA](查询字符串附加)。因此,单独添加单个?正在创建一个空查询字符串以使现有字符串无效。在StackOverflow上有几个使用这种方法的答案。

RewriteCond %{QUERY_STRING} page=(.*) 
RewriteRule .* %1/? [R=301,L] 

使用[QSD]你可以这样写:

RewriteCond %{QUERY_STRING} page=(.*) 
RewriteRule .* %1/ [R=301,L,QSD] 

你的另一场比赛中需要像contact.php文件并将其重定向到/contact/。这也可能仍然有效。

RewriteCond %{REQUEST_URI} !^/index.php$ 
RewriteRule ^(.+)\.php$ /$1/? [R=301,L] 

这条规则也与QSD写成:

RewriteRule ^(.+)\.php$ /$1/ [R=301,L,QSD] 
相关问题