查询字符串隐藏

时间:2013-06-02 13:44:49

标签: php apache .htaccess

我想从网址中删除查询字符串。

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]

不是重写 ...... 我做错了什么?

修改

删除了 Clive

评论的QSL

1 个答案:

答案 0 :(得分:2)

如果查询字符串不为空,我们将使用空查询字符串将原始请求重写为自身。

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

这已经包含在Apache中[QSD] Query String Discard

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

注意: 查询字符串允许您跟踪日志文件和外部源链接中的各种内容。这样做会限制这些选项。

这可能不是你想要做的事情(以这种方式丢失很多旧的SEO链接)。因此,以下是将旧查询字符串重定向到新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]