我需要我的网站用一个参数将所有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: /");
。