htaccess中的params 301重定向出现问题



另一个问题。我们如何重定向此URL:

https://www.example.com/index.php?cl=contact

以下不起作用:

RewriteCond %{QUERY_STRING} ^cl=contact
RewriteRule index.php https://www.example.com/contact [L,R=301]

重定向规则应该有效,尽管它肯定可以优化:

RewriteCond %{QUERY_STRING} ^cl=contact$
RewriteRule ^/?index.php$ https://www.example.com/contact [R=301]

因此,你的实际问题必须是其他问题。你需要检查这些东西:

  • 重写模块是否已加载到http服务器中
  • 是否允许对http主机内的该位置进行重写(请参阅AllowOverride命令(
  • 您在http服务器的错误日志文件中看到了可能相关的内容吗
  • 如果您使用的是动态配置文件(".htaccess"(,它是否位于正确的位置(在DOCUMENT_ROOT文件夹中(
  • 该配置对于http服务器进程来说真的可读吗
  • 该请求实际上是在实现规则的http主机中处理的吗

最好从302临时重定向开始,然后在确定所有设置都正确后,再将其更改为301永久重定向。这可以防止在尝试时出现缓存问题。。。

此实现将在http服务器主机配置或动态配置文件(".htaccess"文件(中同样工作。显然,重写模块需要加载在http服务器内部,并在http主机中启用。如果使用动态配置文件,则需要注意在主机配置中完全启用了它的解释,并且它位于主机的DOCUMENT_ROOT文件夹中。

还有一句话:你应该总是更喜欢在http服务器主机配置中放置这样的规则,而不是使用动态配置文件(".htaccess"(。这些动态配置文件增加了复杂性,通常是导致意外行为的原因,很难调试,而且它们确实会减慢http服务器的速度。它们只是在您无法访问真正的http服务器主机配置(读作:非常便宜的服务提供商(或应用程序坚持编写自己的规则(这显然是一场安全噩梦(的情况下提供的最后一个选项。


更新:

考虑到你在评论中提供的额外信息,这可能是你想要的:

RewriteCond %{QUERY_STRING} ^cl=contact$
RewriteRule ^/?index.php$ https://www.example.com/contact [R=301,QSD]

正如文档所述,QSD标志在重写过程中删除查询字符串。

如果这也不起作用,那么很可能您操作的是非常旧版本的apachehttp服务器。在这种情况下,试试这个变体:

RewriteCond %{QUERY_STRING} ^cl=contact$
RewriteRule ^/?index.php$ https://www.example.com/contact? [R=301]

最新更新