使用获取参数的 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 重定向的主要内容,如果未能解决你的问题,请参考以下文章
使用HttpClient,在301的情况下如何防止自动重定向并获取原始状态码和转发Url [重复]