重写并替换 url 中 get 参数的值

rewrite and replace value of a get param inside url

原始地址 - example.com/index.php?c=bs
或没有 index.php - 即只是 - example.com/?c=bs

地址栏中我想要的内容 - example.com/blue-sky

这是我的尝试 - 没有成功:

RewriteEngine ON
RewriteCond %{THE_REQUEST} \?c=bs [NC]
RewriteRule ^ %1? [R=301,L,NE]
RewriteRule ^([^/.]+)/?$ ?c=blue-sky [L,QSA]  

请帮忙

what I want in address bar - example.com/blue-sky

假设您已经将内部链接更改为所需的 canonical 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).