我想要的地址栏中的内容 - example.com/blue-sky
假设您已经将内部链接更改为所需的规范 URL,那么您可以在.htaccess 中实现以下内容,以将/index.php?c=bs(或/?c=bs)外部重定向到/blue-sky SEO的好处。然后进行重写,将/blue-sky 的内部请求重写回/index.php?c=bs。
例如(假设您使用的是 Apache 2.4):
RewriteEngine On
# Redirect "/index.php?c=bs" (or "/?c=bs") to "/blue-sky"
RewriteCond %{QUERY_STRING} ^c=bs$
RewriteRule ^(index\.php)?$ /blue-sky [QSD,R=301,L]
# Rewrite (internally) "/blue-sky" back to "/index.php?c=bs"
RewriteRule ^blue-sky$ index.php?c=bs [QSA,END]
第一条规则上的QSD 标志需要从重定向响应中丢弃原始查询字符串(即c=bs)。否则,它将重定向到/blue-sky?c=bs。这需要 Apache 2.4
第二条规则上的QSA 标志允许附加初始请求中可能存在的任何其他查询字符串参数。例如。 /blue-sky?foo=1 将被重写为 index.php?c=bs&foo=1。如果这不是必需的,并且您不希望有任何其他查询字符串,则删除 QSA 标志。
END 标志(相对于L)防止重写引擎进一步循环,从而防止重写的 URL 被重定向回规范 URL(否则会导致无限的重定向循环)。 END 标志需要 Apache 2.4。
看看你的指令:
RewriteCond %{THE_REQUEST} \?c=bs [NC]
RewriteRule ^ %1? [R=301,L,NE]
RewriteRule ^([^/.]+)/?$ ?c=blue-sky [L,QSA]
第一条规则本质上会将/<anything>?c=bs 重定向回文档根目录,除了%1 反向引用是空 并且没有RewriteBase 指令,这将导致格式错误的重定向,暴露绝对文件系统目录。
第二条规则将/<anything>重写为?c=blue-sky,这应该是c=bs(但这会导致重定向循环,因为重写引擎使用L重新启动,而不是END )。