views:

378

answers:

2

Trying,

  <IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_METHOD} ^TRACE
  RewriteRule .* - [F]
  RewriteCond %{HTTP_HOST} ^(.*)dev\.example\.edu$ [NC]
  RewriteRule ^/test(.*)$ http://dev.example.edu/test/index.php/test$1 [NC]
  </IfModule>

on an apache 2.2 server, to get this rewrite working to hide the "index.php/test" part of the path.

everything i've tried either loops the url part (index.php/test) within the address bar or gives a "too many redirects" error.

i suspect that the "test" part of the equation being on both sides is throwing it off but am not sure how to get it to work.

i just want: dev.example.edu/test/index.php/test* to rewrite to: dev.example.edu/test/*

thanks

+1  A: 

You need to exclude the destination path to avoid an infinite recursion:

RewriteCond %{HTTP_HOST} ^(.*)dev\.example\.com$ [NC]
RewriteCond $1 !^/index\.php/test/
RewriteRule ^/test/(.*)$ http://dev.example.com/test/index.php/test/$1 [NC]

Here the match of the first grouping ($1) is checked not to match ^/index\.php/test/.

But if you want to rewrite /test/index.php/test/… to /test/…, you will rather need this rule:

RewriteCond %{HTTP_HOST} ^(.*)dev\.example\.com$ [NC]
RewriteRule ^/index\.php/test/(.*)$ http://dev.example.com/test/$1 [NC]
Gumbo
i'm a little confused by this. in your second example, isn't the pattern switched with the match? i see it as: RewriteRule Substitution(switchThis) Pattern(withthis), when i expect the opposite
chris
@chris: You’re absolutely right. The syntax is of course `RewriteRule pattern substutution`. *But* you would say “I want pattern to be rewritten to substitution” and *not* vice versa. Because that’s how mod\_rewrite works.
Gumbo
A: 

Per Jim at webmasterworld (thanks!)

"The [P] flag invokes a reverse-proxy request to the server at the designated URL; That is, it opens a new out-going HTTP connection and sends a request to that server. So at the very least, your configuration is twice as slow as it should be, just using the original working rule, because your server is sending itself a new request via HTTP instead of just serving the content from a non-default-mapped filepath.

It seems to me that all that's needed is an internal rewrite, so that requests for the resource at URL http://dev.example.edu/distribution/ are served with the content generated by the script at the server filepath /distribution/index.php/distribution/"

RewriteEngine on 
# 
# Return 403-Forbidden response to TRACE requests 
RewriteCond %{REQUEST_METHOD} ^TRACE 
RewriteRule .* - [F] 
# 
# Internally rewrite requests for URL-path /recreation/<anything> 
# to filepath /eel/index.php/recreation/<anything> 
RewriteCond %{HTTP_HOST} ^dev\.example\.edu [NC] 
RewriteRule ^/recreation/(.*)$ /ee1/index.php/recreation/$1 [L] 
# 
# Internally rewrite requests for URL-path /distribution/<anything> 
# to filepath /distribution/index.php/distribution/<anything> 
RewriteCond %{HTTP_HOST} ^dev\.example\.edu [NC] 
RewriteRule ^/distribution/(.*)$ /distribution/index.php/distribution/$1 [L]

So I think I was just making it more complicated than it had to be. I've removed the P flag and removed the full server address from the rewriterule.

chris