使用.htaccess和mod_rewrite重定向目录,但有一些例外

时间:2010-06-02 12:05:21

标签: regex .htaccess mod-rewrite

我在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]

有些冗余但有效。

2 个答案:

答案 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以任何给定的字符串开头,

就不会匹配而不转发用户。