【问题标题】:URL rewrite on G-WAN for .JPG.JPG 在 G-WAN 上的 URL 重写
【发布时间】:2012-11-13 09:50:00
【问题描述】:

我正在测试 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,没有任何处理程序的详细信息。

提前感谢您的支持

【问题讨论】:

    标签: url-rewriting g-wan


    【解决方案1】:

    您必须使用 G-WAN connection handler,才能使用:

    • 简单重写:developers 页面末尾给出了一个示例,

    或,

    • regex 库(libc 提供正则表达式调用)如果您针对更通用的重写方案。这是example in C,解释是there,由“Linux Gazette”中的“C 中的正则表达式”提供。

    这也可以通过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 等)的名称。

    【讨论】:

    • 感谢您的回复。我测试了开发人员页面,所以我创建了 c servlet blog.c(效果很好)。在处理程序中,我创建了 main.c,其中包含源代码或在 main 函数中重写。 Gwan 启动良好,但是当我使用 localhost 进行测试时,出现 404 错误。当 gwan 启动并且在日志、处理程序和 csp 加载良好时,我没有错误。问候
    • 404 表示没有找到你重写的结果。尝试使用 printf() 来显示它,这样你就可以检查出了什么问题。另外,如果上面的答案是正确的,如果您通过点击它的“投票”号码来获得一个绿色的勾号来接受它,它将有助于其他用户。
    • 我知道 404 是什么意思,但对我来说,gwan 无法识别用我的代码重写 url。那么,在文件夹处理程序的 main.c 中创建它是否正确?我如何使用 printf (它不想启动服务器)以及在哪里?在处理程序中?在小服务程序中?我迷路了……
    • 检查您的处理程序(在 /handlers 下正确命名和复制)是否有效。查看 /log/error.log 文件(或在处理程序中使用 printf())以查看 G-WAN 试图提供的 rewritten 资源(但未能找到)。如果你不能让它工作,那么如果你成为注册用户,你还可以获得个性化的支持并将你的源代码发送给我们以供审查。
    • 我的处理程序在路径 /0.0.0.0_80/#0.0.0.0/handlers 中被称为 url_wr.c。该脚本与示例中的完全相同:我创建了一个 servlet 博客,它是 hello.c 的副本。在 error.log 中,我只有 404 错误。在 gwan.log 中,没有写入我的处理程序已加载。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多