2015-08-28 61 views
1

我创建了一个apache模块,可以防止用户通过一连串的重定向页面来检索他们最终想要的页面。这是到目前为止我的代码:通过定制apache模块避免登陆页面重定向

#include "httpd.h" 
#include "http_config.h" 
#include "http_protocol.h" 
#include "ap_config.h" 
#include "http_log.h" 

static int subreq_handler(request_rec *r){ 
    if(ap_is_initial_req(r)){ 
    r->content_type = "text/html"; 
    apr_table_set(r->headers_out, "Hostname","127.0.0.2"); 
    request_rec* rr=ap_sub_req_method_uri("GET","/folder",r,NULL); 
    if (rr){ 
     char *l=apr_table_get(rr->headers_out, "location"); 
     ap_rprintf(r,"redir=%s\n", l); 
     ap_rprintf(r,"rr->status=%d\n", rr->status); 
     ap_destroy_sub_req(rr); 
    } 
    return DONE; 
    } 
} 

static void subreq_register_hooks(apr_pool_t *p){ap_hook_fixups(subreq_handler, NULL, NULL, APR_HOOK_FIRST);} 
module AP_MODULE_DECLARE_DATA subreq_module={STANDARD20_MODULE_STUFF,NULL,NULL,NULL,NULL,NULL,subreq_register_hooks}; 

代码返回状态301,当我在与实际文件夹名称代码替换/folder没有斜线和REDIR值也是正确的,与整个填写这是个好新的网址。

我想这与任何URI请求的发生,但是当我试图请求一个PHP文件,而不是(更换/folder/path/to/file.php),其中包含的指令重定向,返回的状态是200,但是应该是301

的以下是PHP文件中使用的PHP代码。

<?php 
header("HTTP/1.1 301 Moved",true); 
header("Location: /",true); 
?> 

有谁知道如何使一个Apache子请求任何域本地网络上的任何文件,具有文件返回的真实状态,如果状态为301,使其返回新真位置?如果是这样,请告知。

回答

0

怎么样使用ErrorDocument

如果用户请求找不到请求的文件,ErrorDocument 404可以加载搜索该文件的.php页面。

http://httpd.apache.org/docs/2.4/custom-error.html

+0

文件未找到是一个不同的故事。我想要做的是*减少重定向链*的数量,这样,而不是用户被重定向到重定向然后重定向然后重定向等,用户只会被重定向一次。 – Mike

+0

对不起。也许它会帮助别人给你一个更好的答案,如果你发布你试图减少的重定向。 – user2182349

+0

每一个。由于这段代码将进入托管许多网站的服务器的后端,因此很难将它们全部识别出来,所以我正在通过(试图制作)一个模块将所有重定向减少到最多。 – Mike