views:

455

answers:

3

I am trying to let the "trac" directory and all of it's subdirectories be accessible through the url http://www.domain.com/trac/

I am working with the codeginiter framework and my directory structure looks like

.htaccess
index.php
system
trac

I can access the abov url fine, but the problem is the scripts and other files contained in trac subdirectories ie: trac/chrome/common/css/trac.css are not accessible and 404. Here is my .htaccess code. Please help.

RewriteEngine On
RewriteRule ^$ index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
RewriteCond $1 !^trac/
RewriteRule ^trac/(.*) /trac/$1
A: 

If you remove the last two lines, it should work.

RewriteCond %{REQUEST_FILENAME} !-f checks to ensure that you're not requesting a file. If you are, this condition fails and the rule RewriteRule ^(.*)$ index.php?/$1 [L] is never executed.

Coomer
A: 

rewrite rules are executed in order... so try this

RewriteCond %{REQUEST_URI} !^/trac/
RewriteCond $1 !(index\.php/)
RewriteRule ^(.*)$ index.php?/$1 [L]

Explanation:

if the uri DOES NOT start with trac
if the uri IS NOT index.php
rewrite url as index.php?/{rest of the url}
pǝlɐɥʞ
+1  A: 

You don't even need to mention /trac/ in your .htaccess. That's EXACTLY the point of

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

You're setting two "Rewrite Conditions." The first one says, "As long as the request isn't a file." The second one says "OR As long as the request isn't a directory."

Then

RewriteRule ^(.*)$ index.php?/$1 [L]

Sends everything else to index.php, where CI takes over. And just for the record, my full .htaccess that I use on every project:

Options +FollowSymLinks

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]

If you're confused about the RewriteCond %{REQUEST_URL} ^system.* line, it only exists so that any browser requests to the /system/ folder is always routed to index.php, and therefor ignored.

Zack