另一个问题。我们如何重定向此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]