.htaccess 带有文字问号(非查询字符串)的htaccess重写规则
我需要能够匹配问号,因为有一个翻译文本编码错误,并且URL的一部分最终用问号硬编码。下面是我需要重写的URL示例:.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
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
模式匹配)重写规则
- 查询字符串:
(注3??/index.html
-第一个开始查询字符串)?
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]