Nginx 用 %3F 重写

Nginx rewrites with %3F

对于站点 运行 Mediawiki,我有这个配置用于清理 URLs:

rewrite ^/wiki/([^?]*)(?:\?(.*))? /wiki/index.php?title=& last;

除非页面标题需要有问号,否则这可以正常工作。对于像 /wiki/Who_is_your_daddy%3F_It_is_me 这样的 URL,正确重写的 URL 是 /wiki/index.php?title=Who_is_your_daddy%3F_It_is_me。但是,Nginx 正在重写 /wiki/index.php?title=Who_is_your_daddy&_It_is_me.

正确的重写规则是什么?

查询字符串不是由 rewrite 指令的正则表达式处理的规范化 URI 的一部分。但是,查询字符串将自动附加到重写的 URI 中,因此您无需执行任何操作来包含 &action=edit 部分。有关详细信息,请参阅 this document

原始请求中的 %3F 将在 rewrite 处理它时规范化为 ?。您需要捕获 ? 的两边,以手动将其翻译回新查询字符串中的 %3F

您可以使用多个 rewrite 语句,这样带和不带 %3F 的情况都会得到正确处理。

例如:

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