3

我正在测试 G-WAN 服务器,我想使用重写规则。

使用 apache 的规则是:

RewriteRule ^(.+)-(.+)-(.+)-1.jpg$ imagesproduitnew/$3/$2.jpg [L]

我正在尝试通过处理程序来做到这一点JPG,但我遇到了很多困难。

有没有人做过类似的事情?


我的处理程序在路径 /0.0.0.0_80/#0.0.0.0/handlers 中称为 url_wr.c 这是脚本

int init(char *argv[], int argc);

int main(int argc, char *argv[])
{
   const long state = (long)argv[0];
   if(state == HDL_AFTER_READ)
   {
      xbuf_t *read_xbuf = (xbuf_t*)get_env(argv, READ_XBUF);
      xbuf_replfrto(read_xbuf, read_xbuf->ptr, read_xbuf->ptr + 16, "/blog", "/?blog");
   }
   return 255; // execute next connection step
}

int clean(char *argv[], int argc);

在 gwan.log 中,没有写入加载的 url_wr.c 如果我将 printf 放在每个函数中,它就不起作用。servlet bloc.c 运行良好。

我还尝试将代码放在 handlers/main.c 和 gwan 目录的根目录中。

我只有该站点的 error.log 文件,它只显示 error404,没有任何处理程序的详细信息。

预先感谢您的支持

4

1 回答 1

1

您必须使用 G-WAN connection handler,或者使用:

或者,

  • regex如果您针对更通用的重写方案,则需要一个库(libc 提供正则表达式调用)。这是C 中的一个示例,其中的解释由“Linux Gazette”中的“Regular Expressions in C”提供。

这也可以通过 rom a 进行servlet,但是您必须触发重定向(除非资源被明确地放入缓存中)。如果这是可以接受的,那么 v3.10+ 将允许您在 C#、PHP、Python 等中执行此操作。


更新问题中发布的代码:

您的init()电话是空的,因此main()永远不会被调用。你应该这样做:

// ----------------------------------------------------------------------------
// init() will initialize your data structures, load your files, etc.
// ----------------------------------------------------------------------------
// init() should return -1 if failure (to allocate memory for example)
int init(int argc, char *argv[])
{
   // define which handler states we want to be notified in main():
   // enum HANDLER_ACT { 
   //  HDL_INIT = 0, 
   //  HDL_AFTER_ACCEPT, // just after accept (only client IP address setup)
   //  HDL_AFTER_READ,   // each time a read was done until HTTP request OK
   //  HDL_BEFORE_PARSE, // HTTP verb/URI validated but HTTP headers are not 
   //  HDL_AFTER_PARSE,  // HTTP headers validated, ready to build reply
   //  HDL_BEFORE_WRITE, // after a reply was built, but before it is sent
   //  HDL_HTTP_ERRORS,  // when G-WAN is going to reply with an HTTP error
   //  HDL_CLEANUP };
   //
   u32 *states = (u32*)get_env(argv, US_HANDLER_STATES);
   *states = 1 << HDL_AFTER_READ; // we assume "GET /hello" sent in one shot
   puts("init()");
   return 0;
}

另外,请确保connection handlers命名为main.c. 相反,content handlers携带目标文件扩展名(gif.c、html.c 等)的名称。

于 2012-11-13T13:28:10.440 回答