Nginx (Perl) 正则表达式从 URL 重新路由到另一个

Nginx (Perl) regular expression to reroute from a URL to another

我有一个 wordpress 博客,其中有一系列 posts 和他们自己的 slug。最近我注意到人们访问 mysite.com/my-slug/&somestuff 时会出现合法的 404 错误。或我的网站。come/my-slug/somestuff。我不知道他们从哪里得到 'somestuff' 但我希望能够阻止这种情况。

我写了一个正则表达式来从我的网站重新路由。com/my-slug/anything 到我的网站。com/my-slug/

^/easy-fluffy-american-pancakes/.+

效果很好。差不多吧。事实证明,我对任何 post 的打印友好视图是

^/easy-fluffy-american-pancakes/print/1234

1234 是 post ID。所以现在,它也被重定向到 post。如何从重定向中排除打印?

^/easy-fluffy-american-pancakes/(.+)|(?!print/[0-9]*/)

我不能完全让它工作。要么不匹配,要么我收到太多重定向。

关闭

^/easy-fluffy-american-pancakes/(?!print/[0-9]).+

(?!...) 读作“后面没有...”。从(?!...)的外部来看,(?!...)没有匹配到任何东西,所以.+紧跟在/之后开始匹配。

如果您将字符串结尾检查添加到否定前瞻中,它还会捕获带有尾随垃圾的 prints。如果这是一个问题。

print "foo/" =~ m{foo/(?!print/[0-9]+$).+} ? "redirect" : "pass";
pass

print "foo/9ujsdu" =~ m{foo/(?!print/[0-9]+$).+} ? "redirect" : "pass";
redirect

print "foo/print/1234" =~ m{foo/(?!print/[0-9]+$).+} ? "redirect" : "pass";
pass

print "foo/print/1234?o=1" =~ m{foo/(?!print/[0-9]+$).+} ? "redirect" : "pass";
redirect