apache - 允许在 URL/URI w/o 编码中使用非查询问号 "?"

标签 apache .htaccess mod-rewrite url-rewriting rewrite

设置
我们的 HTTP/web 服务器上有以下目录结构:

/questions/who?/
/questions/what?/
/happy? part. 01/
/happy? yet?/
/happy? yet? again? really?!/

我的问题:是否可以正确解析带有未转义/未编码问号( ? )的相应 URI/URL?例如网址 http://test.org/happy? part. 01/将解析为 /happy? part. 01/在服务器上。由于 ?表示查询字符串,这对我来说是一个问题。
背景调查
正如预期的那样,Apache 默认处理第一个 ?作为查询字符串的开头。所以开箱即用的 URL 是 http://test.org/happy? part. 01/将转换为 URI 路径 /happy和查询字符串 part.01/ ,由于路径 /happy 导致 404不存在。
我在研究中发现的大多数其他答案/提示主要涉及重写 URL,假设 ?表示查询字符串,例如
  • .htaccess Question mark allowing
  • Apache .htaccess: How to remove question mark from URL if not `?id=(.*)`?
  • htaccess rewrite rule, remove question mark

  • 但是,在这种情况下 我们可以假设我们的 HTTP 服务器不会接收带有查询字符串的 URL .
    我意识到通常浏览器/等。将在将 URI 发送到服务器之前对其进行编码(例如 http://test.org/happy? part. 01/ 将作为 http://test.org/happy%3F%20part.%2001/ 发送到服务器,尽管哪些字符被编码 depends on the app 以及它们对哪个 URI 标准版本的支持:RFC2396RFC3986 )。但是对于这种情况,服务器可能会获得未编码的 URL,但不会获得任何带有查询字符串的 URL。
    我的尝试
    起初我认为这样的简单规则就足够了:
    RewriteRule ([^\?]*?)\?([^\?]*?) $1\?$2 [NE,N]
    
    在这里,我试图反复找到所有 ? s 并简单地将它们重新插入到未转义的 URL 中。不幸的是,正则表达式(以及许多变体)与包含 ? 的 URL 不匹配。 ,而是只匹配编码的 ?值(value) %3F .即使匹配,第二个捕获组 $2似乎永远是空的。最后,\?在替换字符串中似乎阻止了它被写入后的任何内容。
    上面链接的解决方案让我发现要检查 ?我不得不检查 %{THE_REQUEST}变量,因为 Apache 将删除其他服务器变量/RewriteRules 的查询字符串。为此,我尝试了以下变体:
    RewriteCond %{THE_REQUEST} ^[A-Z]+\ \/([^\?]*?)\?([^\?]*?)\/?\ HTTP
    RewriteRule ^(.*?)\?(.*?)$ $1\?$2 [NE,N]
    
    RewriteCond的正则表达式正在将 URI 与 ? 匹配, %2RewriteRule导致 Internal Server Error ,尽管没有它,我似乎无法访问 ? 之后的 URL 部分。 .
    最后,我还用 %{QUERY_STRING} 尝试了各种方法和 [QSA]但仍然没有运气。
    谢谢参观。

    最佳答案

    简单地说:

    RewriteCond %{ENV:REDIRECT_STATUS} !200
    RewriteCond %{QUERY_STRING} !^$
    RewriteRule ^(.*)$ /$1\%3F%{QUERY_STRING} [L,NE]
    

    编辑:

    尝试这个:
    RewriteCond %{QUERY_STRING} ^(.*)\?(.*)$
    RewriteRule ^(.*)$ /$1?%1\%3F%2 [L]
    
    RewriteCond %{QUERY_STRING} !^$
    RewriteRule ^(.*)$ /$1\%3F%{QUERY_STRING}? [L,NE]
    

    关于apache - 允许在 URL/URI w/o 编码中使用非查询问号 "?",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28503413/

    相关文章:

    .htaccess 重写 php 分页

    .htaccess - 在 Drupal 中,如何使用 .htaccess 从 ?q= 重定向到干净的 URL?

    javascript - 脚本被解释为样式表,但以 MIME 类型 text/html 传输

    redirect - 我可以创建从 www.xcompany.com 到 shop.xcompany.com 的 301 重定向吗?

    .htaccess 隐藏文件扩展名不起作用 (WampServer)

    php - 删除包含客户端当前正在下载的文件的目录

    java - GetResourceAsStream 返回 null,文件存在

    apache - Linkedin Open Graph 共享不起作用

    apache - URL 重写总重定向(目录异常(exception))

    php - 尝试在 Linux 中通过 PHP 使 apache 运行 Python 时出现权限被拒绝错误