Nginx用%3F重写

Nginx用%3F重写,nginx,mediawiki,Nginx,Mediawiki,对于运行Mediawiki的站点,我有以下用于清除URL的配置: rewrite^/wiki/([^?]*)(?:\?(*))/wiki/index.php?title=$1和$2 last 除非页面标题需要有问号,否则此选项可以正常工作。对于像/wiki/Who_是你的爸爸%3F_它是我这样的URL,正确的重写URL是/wiki/index.php?title=Who_是你的爸爸%3F_它是我。然而,Nginx正在重写为/wiki/index.php?title=谁是你的爸爸&\u It\u是

对于运行Mediawiki的站点,我有以下用于清除URL的配置:

rewrite^/wiki/([^?]*)(?:\?(*))/wiki/index.php?title=$1和$2 last

除非页面标题需要有问号,否则此选项可以正常工作。对于像
/wiki/Who_是你的爸爸%3F_它是我
这样的URL,正确的重写URL是
/wiki/index.php?title=Who_是你的爸爸%3F_它是我
。然而,Nginx正在重写为
/wiki/index.php?title=谁是你的爸爸&\u It\u是我


什么是正确的重写规则?

查询字符串不是由
rewrite
指令的正则表达式处理的标准化URI的一部分。但是,查询字符串将自动附加到重写的URI中,因此不需要做任何事情来包含
&action=edit
部分。有关详细信息,请参阅

原始请求中的
%3F
将在
重写
处理时标准化为
。您需要捕获
的两侧,以手动将其翻译回新查询字符串中的
%3F

您可以使用多个
rewrite
语句,以便正确处理带有和不带
%3F
的情况

例如:

rewrite ^/wiki/(.*)\?(.*)$ /wiki/index.php?title=$1%3f$2 last;
rewrite ^/wiki/(.*)$ /wiki/index.php?title=$1 last;

查询字符串不是由
rewrite
指令的正则表达式处理的标准化URI的一部分。但是,查询字符串将自动附加到重写的URI中,因此不需要做任何事情来包含
&action=edit
部分。有关详细信息,请参阅

原始请求中的
%3F
将在
重写
处理时标准化为
。您需要捕获
的两侧,以手动将其翻译回新查询字符串中的
%3F

您可以使用多个
rewrite
语句,以便正确处理带有和不带
%3F
的情况

例如:

rewrite ^/wiki/(.*)\?(.*)$ /wiki/index.php?title=$1%3f$2 last;
rewrite ^/wiki/(.*)$ /wiki/index.php?title=$1 last;

您需要避开问号,即使用
\?
。另外,如果您需要
$1%3F$2
,为什么要使用
$1和$2
?@MaximSagaydachny
$1和$2
用于
/wiki/PageTitle?action=edit
等情况,因为这应该重写为
/wiki/index.php?title=PageTitle&action=edit
。你会避开哪个问号--你能分享一下正确的重写规则吗?谢谢。您需要避开问号,即使用
\?
。另外,如果您需要
$1%3F$2
,为什么要使用
$1和$2
?@MaximSagaydachny
$1和$2
用于
/wiki/PageTitle?action=edit
等情况,因为这应该重写为
/wiki/index.php?title=PageTitle&action=edit
。你会避开哪个问号--你能分享一下正确的重写规则吗?谢谢