Below are some example configurations for Apache.
The examples include support for uploaded files (e.g. via the file helper), where the web server needs to map the /a/files/ URL to the /files/ folder.
And versioning url's on resourses (e.g. images, CSS, and JavaScript), where the cache headers can also be set with:
ExpiresActive On ExpiresByType image/gif "access plus 12 months" ExpiresByType image/jpeg "access plus 12 months" ExpiresByType image/png "access plus 12 months" ExpiresByType image/x-icon "access plus 12 months" ExpiresByType text/css "access plus 12 months" ExpiresByType application/javascript "access plus 12 months" ExpiresByType application/x-font-woff "access plus 12 months"
Standard setup
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /www/live/test.project/app/public/
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !/original/
RewriteRule ^/a/files/(.*) /www/live/test.project/files/$1 [S=1]
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}$1
RewriteCond $1/$2 -f
RewriteRule ^(.*)/[0-9]+-([^/]+)$ $1/$2 [L]
RewriteCond %{REQUEST_FILENAME} !^/a/files/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/index.php [L]
</VirtualHost>
Simple .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !/original/
RewriteRule ^/a/files/(.*) /www/live/test.project/files/$1
RewriteRule ^(.*)/[0-9]+-([^/]+)$ $1/$2 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php [L]
Sub-folder .htaccess
If the website is going work in a sub-folder (e.g under a WordPress website).
Assuming the main website sets its DocumentRoot to:
/www/live/main.website/public_html/
First create a folder outside of this folder, so you have something like:
/www/live/sub.website/ /www/live/sub.website/app/public/ /www/live/sub.website/files/
Then create a symlink in the main websites DocumentRoot to the public folder of this project.
ln -s /www/live/sub.website/app/public/ /www/live/main.website/public_html/sub-folder
And finaly add (or edit) the .htaccess file:
/www/live/sub.website/app/public/.htaccess
RewriteEngine On
RewriteRule ^(.*)/[0-9]+-([^/]+)$ $1/$2 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /sub-folder/index.php [L]
Note how the last RewriteRule starts with "/sub-folder", this is because the .htaccess version of RewriteRule starts from the DocumentRoot.
For the /a/files/ folder, you can use an install script to create another symlink.
Development URLs
If you work on many websites, and use a URL structure such as:
http://test.project.emma.devcf.com/
Which maps automatically to the appropriate websites folder, then use something like:
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /Volumes/WebServer/Projects/craig.homepage/public
UseCanonicalName off
LogFormat "%h %l %u [%{LOG_INFO}n] [%{%Y-%m-%d %H:%M:%S}t] [%D/%{TIME_INFO}n] \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" inc_info
CustomLog /private/var/log/apache2/access_log inc_info
ErrorLog /private/var/log/apache2/error_log
Alias /phpMyAdmin/ /Volumes/WebServer/Projects/craig.homepage/phpMyAdmin/
RewriteEngine on
#RewriteLog /var/log/apache2/rewrite_log
#RewriteLogLevel 2
#tail -f /var/log/apache2/rewrite_log | grep -o -E "(initial|subreq).*"
# Map project from HOST into FILENAME
RewriteCond %{HTTP_HOST} ^([a-z0-9]+(\.[a-z0-9]+))*\.[a-z]+\.devcf\.com$
RewriteRule ^(/.*) - [NS,E=WEB_ROOT:/Volumes/WebServer/Projects/%1]
# Drop into /files/ folder (if present)
RewriteCond %{REQUEST_FILENAME} ^/a/files
RewriteCond %{ENV:WEB_ROOT}/files -d
RewriteRule ^/a/files(/.*) $1 [NS,E=WEB_ROOT:%{ENV:WEB_ROOT}/files]
# Drop into /app/public/ folder (if present)
RewriteCond %{ENV:WEB_ROOT}/app/public -d
RewriteRule ^(/.*) - [NS,E=WEB_ROOT:%{ENV:WEB_ROOT}/app/public]
# Drop into /public/ folder (if present)
RewriteCond %{ENV:WEB_ROOT}/public -d
RewriteRule ^(/.*) - [NS,E=WEB_ROOT:%{ENV:WEB_ROOT}/public]
# Drop timestamp from url - e.g. "/a/12345-logo.jpg" to "/a/logo.jpg"
RewriteCond %{ENV:WEB_ROOT}/$1/$2 -f
RewriteRule ^(.*)/[0-9]+-([^/]+)$ $1/$2
# If there is a rewrite.php script
RewriteCond %{REQUEST_FILENAME} !^/a/
RewriteCond %{ENV:WEB_ROOT}/a/php/rewrite.php -f
RewriteRule ^(/.*) %{ENV:WEB_ROOT}/a/php/rewrite.php [L]
# Apply the WEB_ROOT, both if initial request or as a sub-request... but only when set (not homepage)
RewriteCond %{ENV:WEB_ROOT} !=""
RewriteRule ^(/.*) %{ENV:WEB_ROOT}$1
</VirtualHost>
<Directory "/Volumes/WebServer/Projects">
AllowOverride All
Options +Indexes +Includes
Order allow,deny
Allow from all
</Directory>
<Directory "/Volumes/WebServer/Projects/craig.homepage/phpMyAdmin">
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
<VirtualHost *:80>
ServerName localhost
RewriteEngine on
RewriteRule ^/(.*) http://emma.devcf.com/$1 [R=301]
</VirtualHost>