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]

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

编辑

删除了Clive评论的 QSL

4

1 回答 1

2

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

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

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

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

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

这可能不是您想要做的(这样会丢失很多用于 SEO 的旧链接)。因此,以下是如何将旧查询字符串作为 301 重定向重定向到新 URL。对于不熟悉 RegEx 或 Apache 工作原理的人来说,这在视觉上会有些混乱。在字符串的第一部分以问号结尾表示“可能是前面的字符”。在这种情况下,我们?在替换的末尾附加了 (不是 REGEX 模式),因为 Apache 的默认行为类似于QSD 标志的 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]
于 2013-06-02T15:15:29.723 回答