在.htaccess中从根之后的任何查询字符串重写为根



我需要我的网站用一个参数将所有URL重定向到一个干净的路径:

拥有:

http://example.com/?id=1

想要:

http://example.com

为什么这样?我在我的单页网站中使用分享和点赞facebook按钮,当你来自一个带有参数的链接时,facebook按钮不会显示累积点赞(它将此视为一个新页面)。所以我需要重定向到干净的根路径来显示它们。

仅从主页中删除任何查询字符串

.htaccess中,您可以使用mod_rewrite重定向所有包含任何查询字符串的请求。尝试以下操作:

RewriteEngine On
RewriteCond %{QUERY_STRING} .
RewriteRule ^$ /? [R,L]

与问题中给出的示例一样,这只重定向针对文档根目录/主页的请求。(即,不是形式为example.com/something?id=1的URL)。

RewriteCond指令检查查询字符串是否至少有1个字符(即正则表达式.)。

查询字符串是";移除";通过在替换字符串(后面的?)中追加一个空查询字符串。重定向响应中不存在?

如果您要求此重定向是永久性的,则将R标志更改为读取R=301,否则它将默认为302(临时)重定向。


更通用,任何URL路径

如果您想要一个更通用的解决方案来从任何URL路径中删除查询字符串,那么您可以将RewriteRule指令更改为以下指令(保持与上述相同的RewriteCond指令):

RewriteRule ^ %{REQUEST_URI} [QSD,R=302,L]

现在,对example.com/anything?something的请求将被重定向到example.com/anything

这还使用QSD(查询字符串丢弃)标志(Apache 2.4)来删除查询字符串,而不是像Apache 2.2及更早版本(第一个示例)所要求的那样附加一个空查询字符串。


边缘大小写-空查询字符串

上面指令的一个小警告是,不会删除现有的、但为空的查询字符串(例如,带有尾随?的URL路径)。例如,给定形式为example.com/?的请求,则后面的?将保留,因为查询字符串严格地为"0";"空";(并且上述条件不匹配)。

如果您特别想缓存这个边缘情况,那么您可以在RewriteCond指令中与THE_REQUEST进行匹配。例如:

RewriteCond %{THE_REQUEST} ?
RewriteRule ^ %{REQUEST_URI} [QSD,R=302,L]

条件只是检查URL中任何位置的未编码?

您放置了一个PHP标记,因此这是一个PHP解决方案。

index.php中,您可以检查是否有任何GET变量,并重定向回站点。这需要在页面发送任何输出之前,因此它应该尽可能靠近页面顶部。

if (count($_GET) > 0) {
header("Location: " . $_SERVER['PHP_SELF']);
die(); // Very important to prevent the rest of the page from executing anyway
}

如果您想确保隐藏脚本的名称,也可以使用header("Location: /");

最新更新