2010-06-02 33 views
1

我在ManagedFusion设置文件(类似于.htaccess)中使用mod_rewrite,并且我想将所有传入请求转发到服务器上的另一个端口,除了几个文件夹。使用.htaccess和mod_rewrite重定向目录几个例外

到目前为止,我有这个(与文件夹的用户界面,形式,clientsystem和被忽略的小部件)

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] 

这种精细的工作,只要这些例外目录不存在,创建然而,当他们, rewriteengine只会再次触发,在这种情况下,它会匹配规则,因此最终转发给另一个端口。

我该如何解决这个问题?

另一个问题,如果我想要像'?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] 

有些冗余,但它的作品。

+1

关于rewriterule中的regexp备注:我认为你不需要首先/之后^。如果你想确定,追加?之后/所以它总是匹配,有或没有/作为第一个字符。 – 2010-06-02 12:29:50

回答

1

至于你的问题的第二部分,使RewriteRule标志如下所示:[P,L,QSA]。 QSA代表查询字符串追加,并且在发生重定向之前会对您的最终字符串做出明显的改动。

顺便说一句,你很可能想在标志中包含R,因为它会真正将客户端重定向到新的URL。

更新:所以现在我明白你想在任何情况下跳过这些目录?

如果这是这样,那么你可以使用

RewriteCond $1 !^ui 
RewriteCond $1 !^forms 
... 
RewriteRule ^/(.*) http://localhost:8050/$1 [P,L,QSA] 

这将根本不匹配,如果请求的URL不能转发用户与任何特定字符串的开始。

+0

谢谢,是的,你是对的我不想在任何情况下转发。他的解决方案似乎也行得通,我也会尝试你的。 – 2010-06-02 12:29:25

+0

我试过QSA旗,但我不确定它是否有效。有没有一种方法可以轻松测试?我去了http:// localhost:8040/test /?tempquery,并且在日志文件中使用RewriteLog“rewrite.log”和RewriteLogLevel 9开启了日志记录:2010-06-02T14:41:58 [Rewrite]代理服务器:http:// localhost:8050/test/ 这是预期的吗? – 2010-06-02 12:54:33

+0

你应该看到你的完整的URL,以及在你的日志中的查询字符串部分,如127.0.0.1 - [02/Jun/2010:15:13:58 +0200] [localhost/sid#.../initial ](1)[perdir C:/ www/root /]重定向到http://localhost/index.php?asdf [REDIRECT/302]。老实说,我不知道mod_rewrite如何处理内部重定向到另一个主机。所以,根据我的经验,我会在那里使用R,QSA标志,并且不会有任何问题。 – 2010-06-02 13:17:30

1

尝试增加这仅适用规则,如果该名称的文件或目录不存在:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

顺便说一句,我觉得这是mod_rewrite的小抄非常方便:http://dreev.es/modrewrite