重写并替换 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
).
原始地址 - 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
).