Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess 带有文字问号(非查询字符串)的htaccess重写规则_.htaccess_Mod Rewrite_Url Rewriting - Fatal编程技术网

.htaccess 带有文字问号(非查询字符串)的htaccess重写规则

.htaccess 带有文字问号(非查询字符串)的htaccess重写规则,.htaccess,mod-rewrite,url-rewriting,.htaccess,Mod Rewrite,Url Rewriting,我需要能够匹配问号,因为有一个翻译文本编码错误,并且URL的一部分最终用问号硬编码。下面是我需要重写的URL示例: https://example.com/Documentation/Product????/index.html 这是我目前的重写规则。当“产品”后面的字符不是问号时,该规则有效,但当它们是问号时,该规则不适用 RewriteRule "^Documentation/Product[^/]+/(.*)$" "https://s3.amazonaws.com/company-doc

我需要能够匹配问号,因为有一个翻译文本编码错误,并且URL的一部分最终用问号硬编码。下面是我需要重写的URL示例:

https://example.com/Documentation/Product????/index.html
这是我目前的重写规则。当“产品”后面的字符不是问号时,该规则有效,但当它们是问号时,该规则不适用

RewriteRule "^Documentation/Product[^/]+/(.*)$" "https://s3.amazonaws.com/company-documentation/Help/Product/$1" [L,NC]
我如何确保问号在此规则中也被视为字符?我不能期望URL中只有问号而不是原始的非英语字符,所以我希望上面的规则同时匹配问号和任何其他字符

我发现这个主题似乎很相关,但这些标志没有帮助,答案也没有解释如何克服“旁白”中提到的问题。

你说它“不是一个查询字符串”,但实际上它就是这样。这就是为什么不能将其与
重写规则
模式匹配。上述URL拆分如下:

  • URL路径:
    /Documentation/Product
    (由
    重写规则
    模式匹配)
  • 查询字符串:
    ??/index.html
    (注3
    -第一个开始查询字符串)
要匹配查询字符串,您需要一个额外的
RewriteCond
指令,该指令将检查
query\u字符串
服务器变量

例如,要匹配上述URL,您需要执行以下操作:

RewriteCond %{QUERY_STRING} ^\?*/index\.html
RewriteRule ^Documentation/Product$ https://s3.amazonaws.com/company-documentation/Help/Product/index.html [NC,R,L]
这与查询字符串开头的任意数量的错误
匹配

我添加了
R
redirect
)标志。您的指令(没有
R
标志)无论如何都会触发一个外部重定向(因为您在替换中指定了一个绝对URL),但是在这里显式显示要好得多。这也是一个临时(302)重定向。如果这应该是永久性的(301),则将其更改为
R=301
,但只有在您确认其工作正常后(浏览器硬缓存301s,因此可能会导致测试出现问题)


更新:

…因此,我希望上面的规则同时匹配问号和任何其他字符

只有在URL中有问号时才会有查询字符串,所以我认为最好将这两个规则分开

如果查询字符串的开头可能有任何错误字符,并且如果您希望捕获URL的结尾部分(就像您在原始指令中所做的那样,例如,
index.html
),则可以将上述内容修改为:

RewriteCond %{QUERY_STRING} /(.*)$
RewriteRule ^Documentation/Product$ https://s3.amazonaws.com/company-documentation/Help/Product/%1 [NC,R,L]
注意替换字符串中的
%1
(与
$1
相反)反向引用。这是对上次匹配的CondPattern(即,
/(.*)$
)中捕获的组的反向引用

对于不包含
(即查询字符串)的更多“普通”URL,您可以使用现有指令遵循这一点(但请记住包括
R
标志)

注意:在本例中,双引号中的参数完全是可选的。只有在模式或替换参数中有未转义的空格时,才需要它们

总之
#重定向表单的URL:
#“/文档/产品?/”
RewriteCond%{QUERY_STRING}/(*)$
重写规则^Documentation/Product$https://s3.amazonaws.com/company-documentation/Help/Product/%1 [NC,R,L]
#重定向表单的URL路径(无查询字符串):
#“/文档/产品/”
重写规则^Documentation/Product[^/]+/(.*)https://s3.amazonaws.com/company-documentation/Help/Product/$1[NC,R,L]

这是否应该与您现有的规则一起使用?例如,您的URL格式为
/Documentation/Product/
,可重定向到
https://s3.amazonaws.com/company-documentation/Help/Product/
index.html
是变量吗?即使在这些格式错误的URL中,index.html部分也是可变的。对于“普通”URL,我有其他规则。这个问题只需要抓住那些奇怪的问题作为产品的最后手段。旁白:虽然它可能看起来相关,但相关的问题与这个问题并不直接相关。在链接问题中,源URL在URL路径中有文字问号(即问号是URL编码的),因此没有查询字符串(问题#1)。这也被捕获(问题2)并传递给替换(问题3)。关联问题中的“旁白”并不是真正描述一个“问题”,只是一个过程。您可以使用
NE
标志来防止后续的
被URL编码,但这并不一定是可取的。这似乎与我读到的关于URL中第一个问号的内容一致。我一会儿就试试这个。谢谢我已经用更“通用”的解决方案更新了我的答案(关于您的评论和更新的问题)。
RewriteCond %{QUERY_STRING} /(.*)$
RewriteRule ^Documentation/Product$ https://s3.amazonaws.com/company-documentation/Help/Product/%1 [NC,R,L]
# Redirect URLs of the form:
# "/Documentation/Product?<anything#1>/<anything#2>"
RewriteCond %{QUERY_STRING} /(.*)$
RewriteRule ^Documentation/Product$ https://s3.amazonaws.com/company-documentation/Help/Product/%1 [NC,R,L]

# Redirect URL-paths of the form (no query string):
# "/Documentation/Product<something>/<anything>"
RewriteRule ^Documentation/Product[^/]+/(.*) https://s3.amazonaws.com/company-documentation/Help/Product/$1 [NC,R,L]