将Apache2的RewriteCond%{QUERY_STRING}移植到nginx

我做了一个大的基于PHP的网站的静态镜像,使用以下Apache2重写节获取查询string到文件系统path正确地提供静态文件。 旧的dynamicurl foo/?bar映射到静态文件foo/image.php?barfoo/image.php?bar映射到foo/image.php@bar – 所有使用/%2Freplace,无论它出现在bar中在原始网站中最多5次)。 举个例子,我有像example.com/foo/?bar=baz/quux这样的URL,我需要映射到像foo/index.html@bar=baz%2Fquux这样的文件。

 # turn off php php_admin_value engine off # enable rewrites RewriteEngine on # rewrite .../?... to .../index.html@... with s|/|%2F|g RewriteCond %{QUERY_STRING} ^([^/]+)$ RewriteRule ^(.*)/$ %{DOCUMENT_ROOT}/$1/index.html@%1 [L,T=text/html] RewriteCond %{QUERY_STRING} ^([^/]+)/([^/]+)$ RewriteRule ^(.*)/$ %{DOCUMENT_ROOT}/$1/index.html@%1\%2F%2 [L,T=text/html] RewriteCond %{QUERY_STRING} ^([^/]+)/([^/]+)/([^/]+)$ RewriteRule ^(.*)/$ %{DOCUMENT_ROOT}/$1/index.html@%1\%2F%2\%2F%3 [L,T=text/html] RewriteCond %{QUERY_STRING} ^([^/]+)/([^/]+)/([^/]+)/([^/]+)$ RewriteRule ^(.*)/$ %{DOCUMENT_ROOT}/$1/index.html@%1\%2F%2\%2F%3\%2F%4 [L,T=text/html] # rewrite .../image.php?... to .../image.php@... with s|/|%2F|g RewriteCond %{QUERY_STRING} ^([^/]+)$ RewriteRule ^(.*)/image.php$ %{DOCUMENT_ROOT}/$1/image.php@%1 [L,T=image/jpeg] RewriteCond %{QUERY_STRING} ^([^/]+)/([^/]+)$ RewriteRule ^(.*)/image.php$ %{DOCUMENT_ROOT}/$1/image.php@%1\%2F%2 [L,T=image/jpeg] RewriteCond %{QUERY_STRING} ^([^/]+)/([^/]+)/([^/]+)$ RewriteRule ^(.*)/image.php$ %{DOCUMENT_ROOT}/$1/image.php@%1\%2F%2\%2F%3 [L,T=image/jpeg] RewriteCond %{QUERY_STRING} ^([^/]+)/([^/]+)/([^/]+)/([^/]+)$ RewriteRule ^(.*)/image.php$ %{DOCUMENT_ROOT}/$1/image.php@%1\%2F%2\%2F%3\%2F%4 [L,T=image/jpeg] RewriteCond %{QUERY_STRING} ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)$ RewriteRule ^(.*)/image.php$ %{DOCUMENT_ROOT}/$1/image.php@%1\%2F%2\%2F%3\%2F%4\%2F%5 [L,T=image/jpeg] 

上面的Apache2configuration工作正常,但是我们正在迁移到nginx,我在configuration这个用例时遇到了麻烦。 我可以想到几个解决方法,第一个是使用巨大的map指令列出网站上的所有url(由于大小不合需要),第二个是编写一个小的自定义cgi脚本(不希望的,因为这是一个静态镜子)。

有一个优雅的解决scheme吗?

(重命名文件系统上的所有文件是一个选项,如果它使事情变得更容易,但我不知道如何,但更改面向浏览器的URL是不可能的。)

是不是这样的第一个4的工作? 你必须把它们放在相反的位置,这样在全球的位置才能达到它的目标之前,其他地方的位置就不一样了。

 location ~ ^/(?<path>.+)/(?<path2>.+)/(?<path3>.+)/(?<path4>.+)/.*$ { rewrite ^/(.*)/$ /$path/index.html@$query_string%2F$path%2F$path2%2F$path3%2F$path4 break; } location ~ ^/(?<path>.+)/(?<path2>.+)/(?<path3>.+)/.*$ { rewrite ^/(.*)/$ /$path/index.html@$query_string\%2F$path\%2F$path2\%2F$path3 break; } location ~ ^/(?<path>.+)/(?<path2>.+)/.*$ { rewrite ^/(.*)/$ /$path/index.html@$query_string\%2F$path\%2F$path2 break; } location ~ ^/(?<path>.+)/.*$ { rewrite ^/(.*)/$ /$path/index.html@$query_string\%2F$path break; } 

我尝试了一个名为foo的目录,其中我已经把文件称为

  • index.html@bar%2Ffoo

  • index.html@bar%2Ffoo%2Ffoo2

当我访问http:// myserver / foo /?bar时,我得到文件index.html@bar%2Ffoo,当我访问http:// myserver / foo /?bar时,我得到文件index.html@bar%2Ffoo% 2Ffoo2。

我让你适应image.php