Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I'm in the process of migrating a site across from Wordpress to Octopress - but have managed to completely screw up the mod_rewrite settings in the process.

Currently, all the URLs are in the format

http://site.com/archives/yyyy/mmm/posttitle.php

Once ported across to Octopress, they are now in the format:

http://site.com/archives/yyyy/mmm/posttitle

There are also some top-level pages which are all variations of

http://site.com/pagename.php

and are now

http://site.com/pagename

I've got as far as

RewriteRule ^(.+)\.php $1

which seems to work nicely - but as soon as I include a 301 redirect:

RewriteRule ^(.+)\.php $1 [R=301]

the rewrite rule now includes the full file system path - so:

http://site.com/var/www/octopress/archives/yyyy/mmm/posttitle.php

Can anyone point out where I'm going wrong here?

ETA

The RewriteRule is in the <Directory> block:

<Directory />
 ReWriteEngine On
 RewriteRule ^(.+)\.php $1
 Options FollowSymLinks
 AllowOverride All
</Directory>
share|improve this question
1  
Include all your rewrite rules and the context they are in (.htaccess file, vhost, global, <Directory /> block, etc.), they can all matter. –  Ladadadada Feb 25 '13 at 19:54

1 Answer 1

up vote 2 down vote accepted

The regex is matching on the filesystem path rather than the URL, which happens in Directory and htaccess context. in VirtualHost context it matches the URL, as detailed in the Apache HTTPD 2.2 documentation for RewriteRule:

What is matched?

In VirtualHost context, The Pattern will initially be matched against the part of the URL after the hostname and port, and before the query string (e.g. "/app1/index.html"). In Directory and htaccess context, the Pattern will initially be matched against the > filesystem path, after removing the prefix that lead the server to the current RewriteRule (e.g. "app1/index.html" or "index.html" depending on where the directives are defined). If you wish to match against the hostname, port, or query string, use a RewriteCond with the %{HTTP_HOST}, %{SERVER_PORT}, or %{QUERY_STRING} variables respectively.

1

share|improve this answer
    
Moving the ReWriteRule out of the <Directory/> block and into the main <VirtualHost> block works a charm. Simple when you know how :-) –  TimD Feb 26 '13 at 11:55

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.