1

I am running into an odd pathing problem in CodeIgniter/MAMP Pro. I enabled nice URLs in CodeIgniter (hid index.php from URL) by setting $config['index_page'] = ''; in config.php and by adding the following to .htaccess:

RewriteEngine on
RewriteCond $1 !^(index\.php|images|js|css|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

My app was working fine, however I am not able to hit my CSS and JS files for some reason. If i type in http://mysite:8888/js/jquery.js I get a CodeIgniter 404 page. Any idea on why this might be the case?

themarkappleby
  • 704
  • 1
  • 6
  • 17

2 Answers2

2

I use this .htaccess for CodeIgniter projects on MAMP. It supports subfolders too:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    #Removes access to the system folder by users.
    #Additionally this will allow you to create a System.php controller,
    #previously this would not have been possible.
    #'system' can be replaced if you have renamed your system folder.
    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #When your application folder isn't in the system folder
    #This snippet prevents user access to the application folder
    #Submitted by: Fabdrol
    #Rename 'application' to your applications folder name.
    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #Checks to see if the user is attempting to access a valid file,
    #such as an image or css document, if this isn't true it sends the
    #request to index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

<IfModule !mod_rewrite.c>
    # If we don't have mod_rewrite installed, all 404's
    # can be sent to index.php, and everything works as normal.
    # Submitted by: ElliotHaughin

    ErrorDocument 404 /index.php
</IfModule>

.htaccess files are read dynamically and should not need a MAMP restart, unless you adjusted apache's setting files in it's essence.

The robots.txt is not really secret file, so it's not really of importance to mask it out.

The scripts/images/etc. folders you should just add an index.html file, like CodeIgniter does in it's systems folder too. This way users can't browse those folders. Don't forget to copy index.html files into the subfolders too tho. This may seem dirty, but will be a lot cleaner than cluttering your htaccess with even more rules.

  • I updated my question to more accurately and concisely describe my problem. I tried adding your code to my `.htaccess` but it didn't seem to work. It almost seems like MAMP Pro is no longer reading my `.htaccess` file and is instead using some cached version or something. – themarkappleby Mar 06 '13 at 16:34
  • Try to disable caching in your testing environment and only enable it when your project is ready for deployment. Set PHP Extension [Cache] to `--` to prevent these hassles :). –  Mar 06 '13 at 16:37
  • My PHP Cache is set to off in MAMP Pro is this not the same thing? – themarkappleby Mar 06 '13 at 16:38
  • Yes it is :). Are you using the website in your /htdocs/ root or in a subfolder? –  Mar 06 '13 at 16:39
  • Well with MAMP Pro you can specify any folder anywhere as your site root, no need to use htdocs. – themarkappleby Mar 06 '13 at 16:39
  • 1
    This might cause the problem. Can you test this in MAMP (normal version) and see if maybe the use of the designated MAMP Pro folder directive is causing the problem with the `.htaccess`. This .htaccess file needs to reside in the CodeIgniter folder itself, not in the root of the folder you use. So if CodeIgniter resides in a subfolder, the `.htaccess` needs to be in there too in this case. –  Mar 06 '13 at 16:41
  • Tested with regular MAMP and it seems to work correctly. Any idea if anything can be done to fix the problem with MAMP Pro or am I now stuck working in regular MAMP? – themarkappleby Mar 06 '13 at 16:47
  • Well, that's the cool thing about CodeIgniter. Why don't you just develop the website/app with the `/index.php/` derivative on. And put it in the cleaner mode when you publish it. MAMP Pro probably adds so many weirdness in redirecting the paths to that folder you probably won't get .htaccess working right, as the virtual roots are unknown. If you really want to get that to work; you could try to output $_SERVER variables and see what paths the script originates from. Or check out the MAMP Pro forums/support desk if they know how to do that :) –  Mar 06 '13 at 16:50
  • Another way, may sound cheap; is to use OSX folder aliases in your project folders to direct to the `/htdocs/your_project/` folder and be rid of the Apache collision :) –  Mar 06 '13 at 16:52
  • 1
    To note, uninstalling and reinstalling MAMP/MAMP Pro and restarting my machine allowed me to use MAMP Pro once again. – themarkappleby Mar 07 '13 at 14:16
0

I think the above answer is good, but since CI is dynamically writing URLs, I prefer this method. Also, I think this helps with writing better template code. (I tested this specifically on MAMP.)

For one, set the .htaccess file to the following:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|assets|robots\.txt)
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]

Create a new helper in application/helpers. I call mine assets_helper.php but call it whatever is useful. Put this code in that helper file:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

if ( ! function_exists('asset_url()')) {
function asset_url() {
    echo base_url().'assets/';
    }
}

Add the helper to your autoload file in config/autoload.php a la

$autoload['helper'] = array('url', 'assets');

(You may not already have the url helper activated, but it's common.)

And also add a route for the assets folder (in config/routes.php):

$route['assets/(:any)'] = 'assets/$1';

Now when you want to add css, or js or images, you just need to put <? assets_url(); ?> in the template code.

<img src="<? asset_url(); ?>images/logo.png" width="100" height="100" />

or

<link rel="stylesheet" href="<? asset_url(); ?>css/house.css">
russellmania
  • 640
  • 2
  • 8
  • 21