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;
对于站点 运行 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;