【问题标题】:Apache rewrite rule that ignores query/parameters, always redirects based on path忽略查询/参数的 Apache 重写规则,始终基于路径重定向
【发布时间】:2013-03-03 06:33:44
【问题描述】:

我正在尝试创建一个重写规则,该规则将忽略任何额外的 URL 查询/参数并仅根据路径进行重定向。

我的公司有一个 Wifi Hotspot 服务,它会执行一些 DNS 路由技巧来强制人们在使用它之前先登录。不幸的是,当人们从 WiFi 断开连接并返回到他们的正常蜂窝数据服务时,有时 URL 请求仍会发送到我们的主机,它显示为:

www.ourwebsite.com/login?dst=http://www.google.com/m?client=ms-android-verizon&source=android-home

我已经编写了一组规则来处理 /login 和 /login/ 的基本路径以重定向到我们的主页,

RewriteCond %{THE_REQUEST} ^.*\/login/\ HTTP/
RewriteRule ^(.*)login/?$ "/$1" [R=301,L]
RewriteCond %{THE_REQUEST} ^.*\/login\ HTTP/
RewriteRule ^(.*)login?$ "/$1" [R=301,L]

但我无法想出一个适当的字符串来始终在路径上重定向基于灵魂,并忽略任何可能会或可能不会出现的查询参数。

任何帮助将不胜感激!提前致谢。

【问题讨论】:

    标签: apache url mod-rewrite url-rewriting apache2


    【解决方案1】:

    如果我理解正确,应该这样做:

    Options +FollowSymLinks -MultiViews
    RewriteEngine On
    RewriteBase /
    RewriteRule ^login    /?   [R=301,L]
    

    只要传入的 URL 是这样的,这个规则集就会重定向到 root:

    http://www.ourwebsite.com/login?any_query

    【讨论】:

    • 啊,太好了!是的,这正是我想要的,非常感谢!
    【解决方案2】:

    从 Apache 2.4.0 开始,您可以将 QSD-flag 应用于规则。

    当请求的 URI 包含查询字符串而目标 URI 不包含时,RewriteRule 的默认行为是将该查询字符串复制到目标 URI。使用 [QSD] 标志会导致查询字符串被丢弃。 -- https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_qsd

    在早期的 Apache 版本中使用此标志时,您将导致 500 Internal Server Error

    【讨论】:

    • 如果您使用的是 Apache 2.4 或更高版本,这是一个很好的解决方案。
    猜你喜欢
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多