2015-08-28 88 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