代码之家  ›  专栏  ›  技术社区  ›  lccv

使用.htaccess替换URL中的问号

  •  1
  • lccv  · 技术社区  · 2 年前

    我有一些文件存在于一个目录下,其名称包含一个问号。

    我正在尝试替换 ? 具有 %3F (URL编码 ? )但我得到了“404未找到”的回复。URL中的数字是动态的。

    我所拥有的:

    https://www.example.com/uploads/10015015?afe/filename.doc
    

    我需要什么:

    https://www.example.com/uploads/10015015%3Fafe/filename.doc
    

    这是我添加的规则 .htaccess 但它不起作用:

    RewriteCond %{QUERY_STRING} ^?afe([^&]*)
    RewriteRule (.*) /$1%3F%{QUERY_STRING}? [L]
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   MrWhite    2 年前
    RewriteCond %{QUERY_STRING} ^?afe([^&]*)
    RewriteCond %{QUERY_STRING} !=""
    RewriteRule (.*) /$1%3F%{QUERY_STRING}? [L]
    

    这个 QUERY_STRING 服务器变量不包含 ? 本身(查询字符串 分隔符 ). 但是,正则表达式 ^?afe([^&]*) 完全无效( ? 是正则表达式量词,并且 ^ 不可量化),因此这将/应该导致500内部服务器错误,因为regex不能 编译的 。(虽然你说你得到了404分,但这条规则是否正在处理中?!)

    无需检查查询字符串是否为空(秒 条件 )当您已经确定存在与模式匹配的查询字符串时(在第一个 条件 ).

    请尝试以下操作:

    RewriteCond %{QUERY_STRING} ^afe/[^&]+\.doc$
    RewriteRule ^(uploads/.+) $1\%3F%{QUERY_STRING} [NE,QSD,L]
    

    请注意 % 之前 3 必须是反斜杠转义,以避免将其视为数字后引用(否则将为空)。

    我删除了上的斜杠前缀 替代 字符串,因此它将被视为相对文件路径,而不是URL路径(除非您有 RewriteBase 指令集)。

    这个 QSD (查询字符串丢弃)标志是首选的方式 丢弃 Apache 2.4上请求的原始查询字符串,而不是附加一个空的查询字符串(尾随 ? )这在早期版本的Apache上是必需的。