You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Alexei Kosut <ak...@nueva.pvt.k12.ca.us> on 1995/08/20 01:27:25 UTC

Directory indexing

Hmm.

I was recently playing around with a server running CERN httpd 3.0, and I 
noticed something: When Apache (or NCSA httpd) have a directory, say 
/directory/, which does not have an index file and therefore 
autogenetates an index, and you request /directory, it redirects your 
client to /directory/. CERN doesn't do this, but instead simply builds 
the index list with the correctlinks to make it work.

Now, this seemed to me like a sensible thing to do, since it saves a
redirect, and gives the exact same result. So I patched Apache's mod_dir.c
to do this. I'd imagine we'd want to hold off on thinking about this until
the version after 0.8.x, and new features are okay again, but I thought
I'd share it before I forgot about it.  Following is a context diff based
on 0.8.10's mod_dir.c. It seems to work when I tried it, although I may
have missed something. 

*** mod_dir.c	Sat Aug 12 07:33:47 1995
--- mod_dir.c-ak	Sat Aug 19 16:13:18 1995
***************
*** 615,622 ****
              /* screws up formatting, but some need it. should fix. */
  	    /* escape_html(t2); */
              t2 = pstrcat(scratch, t2, "</A>", NULL);
! 	    anchor = pstrcat (scratch, "<A HREF=\"", escape_uri(scratch, t),
! 			      "\">", NULL);
          }
  
          if(dir_opts & FANCY_INDEXING) {
--- 615,626 ----
              /* screws up formatting, but some need it. should fix. */
  	    /* escape_html(t2); */
              t2 = pstrcat(scratch, t2, "</A>", NULL);
! 	    if (!r->path_info || *r->path_info != '/')
! 		anchor = pstrcat (scratch, "<A HREF=\"", name, "/",
! 			          escape_uri(scratch, t), "\">", NULL);
! 	    else
! 		anchor = pstrcat (scratch, "<A HREF=\"", name,
! 			          escape_uri(scratch, t), "\">", NULL);
          }
  
          if(dir_opts & FANCY_INDEXING) {
***************
*** 762,774 ****
  
      if (r->method_number != M_GET) return NOT_IMPLEMENTED;
      
-     if (!r->path_info || *r->path_info != '/') {
-         char* ifile = pstrcat (r->pool, r->uri, "/", NULL);
- 	table_set (r->headers_out, "Location",
- 		   construct_url(r->pool, ifile, r->server));
- 	return REDIRECT;
-     }
- 
      /* KLUDGE --- make the sub_req lookups happen in the right directory.
       * Fixing this in the sub_req_lookup functions themselves is difficult,
       * and would probably break virtual includes...
--- 766,771 ----
***************
*** 784,791 ****
  	if (rr->status == 200 && rr->finfo.st_mode != 0) {
              char *new_uri = pstrdup (r->pool, rr->uri);
  	    destroy_sub_req (rr);
! 	    internal_redirect (new_uri, r);
! 	    return OK;
  	}
  
          destroy_sub_req (rr);
--- 781,797 ----
  	if (rr->status == 200 && rr->finfo.st_mode != 0) {
              char *new_uri = pstrdup (r->pool, rr->uri);
  	    destroy_sub_req (rr);
! 
! 	    if (!r->path_info || *r->path_info != '/') {
! 	        char* ifile = pstrcat (r->pool, r->uri, "/", NULL);
! 		table_set (r->headers_out, "Location",
! 			   construct_url(r->pool, ifile, r->server));
! 		return REDIRECT;
! 	    }
! 	    else {
! 	        internal_redirect (new_uri, r);
! 	        return OK;
! 	    }
  	}
  
          destroy_sub_req (rr);