使用获取参数的 Apache 301 重定向

Posted

技术标签:

【中文标题】使用获取参数的 Apache 301 重定向【英文标题】:Apache 301 redirect with get parameters 【发布时间】:2017-06-07 07:31:12 【问题描述】:

我正在尝试使用 lightspeed 网络服务器 htaccess 进行 301 重定向,但没有成功。

我需要做一个不带任何相关参数的 url 到 url 重定向。

例如:

来自:http://www.example.com/?cat=123

收件人:http://www.example.com/some_url

我试过了:

RewriteRule http://www.example.com/?cat=123 http://www.example.com/some_url/ [R=301,L,NC]

任何帮助将不胜感激。

【问题讨论】:

您必须在问题中内联发布您的代码。没有它,我们将无法为您提供帮助。那么你“没有运气”尝试过的规则是什么? 我已经添加了我尝试使用的代码。 【参考方案1】:

感谢您将代码添加到您的问题中。我们再次看到它的重要性:

您的问题是 RewriteRule 确实不是在 URL 上操作,而是在路径上操作。所以你需要这样的东西:

RewriteEngine on
RewriteRule ^/?$ /some_url/ [R=301,L,NC,QSD]

根据您的问题,不清楚您是要忽略任何 GET 参数,还是只想在设置了某些参数的情况下重定向。所以这里有一个变体,只有在请求中实际设置了某些参数时才会应用:

RewriteEngine on
RewriteCond %QUERY_STRING (?:^|&)cat=123(?:&|$)
RewriteRule ^/?$ /some_url/ [R=301,L,NC,QSD]

另一件不太清楚的事情是,如果您希望重写http://www.example.com/(即路径/ 以下)下面的所有 URL,或者只重写那个确切的 URL。如果您想保留请求的任何潜在的进一步路径组件并仍然重写(例如http://www.example.com/foo => http://www.example.com/some_url/foo),那么您需要在正则表达式中添加捕获并重用捕获的路径组件:

RewriteEngine on
RewriteRule ^/?(.*)$ /some_url/$1 [R=301,L,NC,QSD]

要使其中任何一个工作,您需要通过AllowOverride 命令启用对.htaccess 样式文件的解释。详见重写模块的官方文档。而且您必须注意-htaccess 样式文件实际上可以被http 服务器进程读取,并且它位于本地文件系统的http 主机DOCUMENT_ROOT 文件夹内。


还有一个一般提示:您应该始终喜欢将此类规则放在 http 服务器主机配置中,而不是使用 .htaccess 样式文件。众所周知,这些文件容易出错,难以调试,而且它们确实会降低服务器的速度。它们仅在您无法控制主机配置的情况下(阅读:非常便宜的托管服务提供商)或如果您的应用程序依赖于编写自己的重写规则(这是一个明显的安全噩梦)提供它们作为最后一个选项)。

【讨论】:

我认为 [^|&]cat=123[&|$] 应该是 (?:^|&)cat=123(?:&|$) 并且 ? (或 Apache >= 2.4 的 QSD 标志)在目标末尾缺少以实际删除原始查询字符串(Apache 将在此处复制旧字符串)。 @julp 感谢您的提示!

以上是关于使用获取参数的 Apache 301 重定向的主要内容,如果未能解决你的问题,请参考以下文章

301 使用获取变量重定向分页

浏览器如何使用查询字符串缓存 301 重定向

使用HttpClient,在301的情况下如何防止自动重定向并获取原始状态码和转发Url [重复]

CURL 不遵循 301 重定向,我需要做啥?

在server.js中获取301重定向数据(Express / NextJS)

apache实现301永久性重定向代码