我在ManagedFusion设置文件中使用mod_rewrite(类似于.htaccess),我想将所有传入的请求转发到服务器上的另一个端口,除了几个文件夹。
到目前为止,我有这个(文件夹ui,表单,客户端系统和小部件被忽略)
RewriteEngine On
RewriteCond %{REQUEST_URI} !ui$
RewriteCond %{REQUEST_URI} !forms$
RewriteCond %{REQUEST_URI} !clientsystem$
RewriteCond %{REQUEST_URI} !widgets$
RewriteRule ^/(.*) http://localhost:8050/$1 [P,L]
只要这些异常目录不存在,这就可以正常工作,但是当它们被创建时,重写引擎将再次触发,在这种情况下它将匹配规则,从而将我转发到另一个端口。
我怎么解决这个问题?
另一个问题,如果我想要转发像'?file = bla'这样的查询,那么这只会像这样工作吗?
编辑:这就是我最终的结果:
RewriteCond %{QUERY_STRING} ^(.+)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1 !^ui
RewriteCond $1 !^forms
RewriteCond $1 !^clientsystem
RewriteCond $1 !^widgets
RewriteRule ^/?(.*) http://localhost:8050/$1?%1 [P,L,R]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1 !^ui
RewriteCond $1 !^forms
RewriteCond $1 !^clientsystem
RewriteCond $1 !^widgets
RewriteRule ^/?(.*) http://localhost:8050/$1 [P,R]
有些冗余但有效。
答案 0 :(得分:1)
如果该名称的文件或目录不存在,请尝试添加此选项以仅应用规则:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
顺便说一下,我发现这个mod_rewrite备忘单非常方便:http://dreev.es/modrewrite。
答案 1 :(得分:1)
至于问题的第二部分,请将RewriteRule标记设为:[P,L,QSA]
。 QSA代表查询字符串附加,并且在重定向发生之前将对您的最终字符串做明显的处理。
顺便说一句,您很可能希望在标志中包含R,因为它会真正将客户端重定向到新的URL。
更新:所以现在我明白你想在任何情况下跳过这些目录吗?
如果是这样,那么你可以使用
RewriteCond $1 !^ui
RewriteCond $1 !^forms
...
RewriteRule ^/(.*) http://localhost:8050/$1 [P,L,QSA]
如果请求的URL以任何给定的字符串开头,就不会匹配而不转发用户。