【问题标题】:rewrite and replace value of a get param inside url重写和替换 url 中的 get 参数的值
【发布时间】:2022-01-20 04:39:56
【问题描述】:

原始地址 - 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]  

请帮忙

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    我想要的地址栏中的内容 - 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 )。

    【讨论】:

    • 您应该在某处编写完整的分步教程。整个网络上都没有这样的事情。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 2014-05-16
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多