【问题标题】:Rewriting %3F, etc. to special characters ( ? and = ) Nginx将 %3F 等重写为特殊字符(? 和 =)Nginx
【发布时间】:2014-01-17 09:01:02
【问题描述】:

您好,我的服务器出现问题。我有 4 个指向网页的入站链接,如下所示:

myurl.com/default/page.php%3Fid%3D13

它们应该看起来像这样:

myurl.com/default/page.php?id=13

我需要做什么才能实现这一目标?当您访问编码的 url 链接时,Apache 会吐出 404 错误

【问题讨论】:

    标签: apache nginx rewrite


    【解决方案1】:

    一个可能的解决方案(虽然我不会说这是一个好的解决方案)是设置一个尝试解码 URL 的 404 处理程序。也许你可以做一些花哨的匹配来尝试猜测 404 是否是由于 URL 被编码。

    if(stripos($url, '%3F') !== false){
        header('Location: ' . urldecode($url) );
        exit;
    }
    

    【讨论】:

      【解决方案2】:

      你试过urldecode吗?看起来您正在以某种方式对 URL 进行编码。如果 urldecode 不能解决问题,那么您可以编写一个函数来使用像 this 这样的映射来解码这些特定字符。

      【讨论】:

      • 如何做到这一点?新手来了在 nginx 服务器配置中?
      • 问题不在于 php,而是站点链接到带有“page.php%3Fid%3D13”的 url,导致 404。它应该是“page.php?id=13”
      • 哦,我明白了。对不起,我假设你是用 PHP 得到的,因为你的问题是用 PHP 标记的。我对nginx不熟悉,我去看看。
      • 看来nginx有自己的功能描述here
      • 还可以查看这篇S/O 文章。
      【解决方案3】:

      nginx 将请求的文件名与 args 分开,并对规范化的 URI 进行操作,因此,在 locationrewrite 的第一个参数中,%3F 部分只能与 ? 直接匹配字符(而来自请求的显式 ? 永远不会在这里弥补),因此:

      rewrite     ^/([^?]*)\?(.*)$    /$1?$2?     permanent;
      

      更多细节:https://stackoverflow.com/a/21144014/1122270

      【讨论】:

        猜你喜欢
        • 2017-08-31
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        相关资源
        最近更新 更多