Apache: Difference between revisions
Jump to navigation
Jump to search
m (moved Apache - .htaccess to Apache) |
|||
Line 1: | Line 1: | ||
== References == |
|||
* [http://httpd.apache.org/docs/ Apache Documentation] (a bit fuzzy...) |
|||
** [http://httpd.apache.org/docs/current/mod/mod_rewrite.html mod_rewrite] |
|||
* [http://wiki.apache.org/httpd/FrontPage Apache HTTP Server Wiki] (much clearer but incomplete) |
|||
== Enabling .htaccess files == |
== Enabling .htaccess files == |
||
In case the <tt>.htaccess</tt> files are ignored (see [http://wiki.apache.org/httpd/RewriteHtaccessIgnored]): |
|||
Check that you don't have an overall '''AllowOverride None'' in Apache's configuration file (<tt>/etc/apache2/httpd.conf</tt>) |
|||
Stop! Don't use htaccess files for mod_rewrite unless you have no other choice. Doing so is slow and confusing. |
|||
<ol> |
|||
<li> Put a nonsense line (such as ''Wooga'') in your htaccess file and try the request again. If you don't see a 500 Internal Server Error message, your htaccess file is being ignored altogether. The solution is to set both AllowOverride FileInfo and Options FollowSymlinks in <tt>httpd.conf</tt> (on Ubuntu, check <tt>apache2/sites-enabled/000-default</tt>, or add your own config file in <tt>apache2/conf.d</tt>) for the directory in question.</li> |
|||
<source lang=apache> |
|||
DocumentRoot /var/www |
|||
<Directory /> |
|||
Options FollowSymLinks |
|||
AllowOverride FileInfo # Must *NOT* be ''none'' |
|||
</Directory> |
|||
</source> |
|||
<li> If you think your rules look ok but you still see a 500 Internal Server Error message, make sure mod_rewrite is loaded in the server. </li> |
|||
<li> If you have ensured that mod_rewrite is loaded, and that RewriteRule is enabled for htaccess files, it could be that your rules are looping. </li> |
|||
<li> If none of the above steps help, try a very simple rewrite to check if the module is enabled. For example: </li> |
|||
<source lang=apache> |
|||
RewriteEngine On |
|||
# Redirect all requests to example.com |
|||
RewriteRule ^ http://example.com/ |
|||
</source> |
|||
</ol> |
|||
== Basic Rewrite Rules == |
|||
* References: [http://wiki.apache.org/httpd/Rewrite], [http://httpd.apache.org/docs/current/mod/mod_rewrite.html] |
|||
* Rewrite rules are either defined in virtual host configuration (i.e. <tt>httpd.conf</tt> or similar) or in the <tt>.htaccess</tt> file, per directory ({{red}}discouraged{{/red}} — I don't |
|||
know why exactly; slower...}} |
|||
=== Frequent errors === |
|||
* Make sure that all files in your <tt>/var/www</tt> (or any other relevant directory) are owned by <tt>www:www-data</tt> (if not, rule conditions like <code>RewriteCond %{REQUEST_FILENAME} -f</code> may fail!) |
|||
<source lang=bash> |
|||
sudo chown -R www:www-data /var/www |
|||
</source> |
|||
* If you changed apache config, make sure that you restarted the server |
|||
<source lang=bash> |
|||
sudo /etc/init.d/apache2 restart |
|||
</source> |
|||
* If you use mod_rewrite in <tt>.htaccess</tt> files, make sure that these files are indeed read by Apache (see section above). |
|||
* Enable rewrite log to ease debugging. Add a file <tt>/etc/apache2/conf.d/rewritelog.conf</tt>: |
|||
<source lang=apache> |
|||
RewriteLog "/var/log/apache2/rewrite.log" |
|||
RewriteLogLevel 8 # Max 9 |
|||
</source> |
|||
== Some example of rewrite rules == |
|||
=== Replace query for non-existing images to black or white images depending on URL. |
|||
<source lang=apache> |
|||
# Try to replace query for non-existing images to white/black images |
|||
RewriteEngine On |
|||
RewriteCond %{REQUEST_FILENAME} -f # true if file exists |
|||
RewriteRule (.*) - [L] # Applied if condition above is true, [L] means LAST rule |
|||
# 10-0- up to 10-511- |
|||
RewriteCond %{REQUEST_URI} /10-[0-9]+-([0-9]|[1-9][0-9]|[1-4][0-9][0-9]|50[0-9]|51[0-1])\.png |
|||
RewriteRule (.*) white.png [L] |
|||
# 9-0- up to 9-255- |
|||
RewriteCond %{REQUEST_URI} /9-[0-9]+-([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.png |
|||
RewriteRule (.*) white.png [L] |
|||
# 8-0- up to 8-127- |
|||
RewriteCond %{REQUEST_URI} /8-[0-9]+-([0-9]|[1-9][0-9]|1[01][0-9]|12[0-7])\.png |
|||
RewriteRule (.*) white.png [L] |
|||
# 7-0- up to 7-63- |
|||
RewriteCond %{REQUEST_URI} /7-[0-9]+-([0-9]|[0-5][0-9]|6[0123])\.png |
|||
RewriteRule (.*) white.png [L] |
|||
# 6-0- up to 6-31- |
|||
RewriteCond %{REQUEST_URI} /6-[0-9]+-([0-9]|[0-2][0-9]|3[01])\.png |
|||
RewriteRule (.*) white.png [L] |
|||
# 5-0- up to 5-15- |
|||
RewriteCond %{REQUEST_URI} /5-[0-9]+-([0-9]|1[0-5])\.png |
|||
RewriteRule (.*) white.png [L] |
|||
# 4-0- up to 4-7- |
|||
RewriteCond %{REQUEST_URI} /4-[0-9]+-([0-7])\.png |
|||
RewriteRule (.*) white.png [L] |
|||
# 3-0- up to 3-3- |
|||
RewriteCond %{REQUEST_URI} /3-[0-9]+-([0-3])\.png |
|||
RewriteRule (.*) white.png [L] |
|||
# 2-0- up to 2-1- |
|||
RewriteCond %{REQUEST_URI} /2-[0-9]+-([0-1])\.png |
|||
RewriteRule (.*) white.png [L] |
|||
# 1-0- up to 1-1- |
|||
RewriteCond %{REQUEST_URI} /1-[0-9]+-0\.png |
|||
RewriteRule (.*) white.png [L] |
|||
RewriteRule (.*) black.png [L] |
|||
</source> |
|||
=== Rewrite URL for missing resource === |
|||
From [http://stackoverflow.com/questions/2887861/rewrite-url-for-missing-resource], rewrite URL for missing resource. |
|||
<source lang=apache> |
|||
# For each web request (file or directory) that doesn't start with /en-US/, |
|||
# serve up the original resource if it exists, otherwise serve up the /en-US/ version. |
|||
RewriteCond $0 !^en-US/ |
|||
RewriteCond %{REQUEST_FILENAME} !-f |
|||
RewriteRule .+ en-US/$0 [L] |
|||
</source> |
|||
== Tags == |
== Tags == |
Revision as of 13:03, 25 September 2012
References
- Apache Documentation (a bit fuzzy...)
- Apache HTTP Server Wiki (much clearer but incomplete)
Enabling .htaccess files
In case the .htaccess files are ignored (see [1]):
Stop! Don't use htaccess files for mod_rewrite unless you have no other choice. Doing so is slow and confusing.
- Put a nonsense line (such as Wooga) in your htaccess file and try the request again. If you don't see a 500 Internal Server Error message, your htaccess file is being ignored altogether. The solution is to set both AllowOverride FileInfo and Options FollowSymlinks in httpd.conf (on Ubuntu, check apache2/sites-enabled/000-default, or add your own config file in apache2/conf.d) for the directory in question.
- If you think your rules look ok but you still see a 500 Internal Server Error message, make sure mod_rewrite is loaded in the server.
- If you have ensured that mod_rewrite is loaded, and that RewriteRule is enabled for htaccess files, it could be that your rules are looping.
- If none of the above steps help, try a very simple rewrite to check if the module is enabled. For example:
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride FileInfo # Must *NOT* be ''none''
</Directory>
RewriteEngine On
# Redirect all requests to example.com
RewriteRule ^ http://example.com/
Basic Rewrite Rules
- References: [2], [3]
- Rewrite rules are either defined in virtual host configuration (i.e. httpd.conf or similar) or in the .htaccess file, per directory ({{{1}}}discouragedTemplate:/red — I don't
know why exactly; slower...}}
Frequent errors
- Make sure that all files in your /var/www (or any other relevant directory) are owned by www:www-data (if not, rule conditions like
RewriteCond %{REQUEST_FILENAME} -f
may fail!)
sudo chown -R www:www-data /var/www
- If you changed apache config, make sure that you restarted the server
sudo /etc/init.d/apache2 restart
- If you use mod_rewrite in .htaccess files, make sure that these files are indeed read by Apache (see section above).
- Enable rewrite log to ease debugging. Add a file /etc/apache2/conf.d/rewritelog.conf:
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 8 # Max 9
Some example of rewrite rules
=== Replace query for non-existing images to black or white images depending on URL.
# Try to replace query for non-existing images to white/black images
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f # true if file exists
RewriteRule (.*) - [L] # Applied if condition above is true, [L] means LAST rule
# 10-0- up to 10-511-
RewriteCond %{REQUEST_URI} /10-[0-9]+-([0-9]|[1-9][0-9]|[1-4][0-9][0-9]|50[0-9]|51[0-1])\.png
RewriteRule (.*) white.png [L]
# 9-0- up to 9-255-
RewriteCond %{REQUEST_URI} /9-[0-9]+-([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.png
RewriteRule (.*) white.png [L]
# 8-0- up to 8-127-
RewriteCond %{REQUEST_URI} /8-[0-9]+-([0-9]|[1-9][0-9]|1[01][0-9]|12[0-7])\.png
RewriteRule (.*) white.png [L]
# 7-0- up to 7-63-
RewriteCond %{REQUEST_URI} /7-[0-9]+-([0-9]|[0-5][0-9]|6[0123])\.png
RewriteRule (.*) white.png [L]
# 6-0- up to 6-31-
RewriteCond %{REQUEST_URI} /6-[0-9]+-([0-9]|[0-2][0-9]|3[01])\.png
RewriteRule (.*) white.png [L]
# 5-0- up to 5-15-
RewriteCond %{REQUEST_URI} /5-[0-9]+-([0-9]|1[0-5])\.png
RewriteRule (.*) white.png [L]
# 4-0- up to 4-7-
RewriteCond %{REQUEST_URI} /4-[0-9]+-([0-7])\.png
RewriteRule (.*) white.png [L]
# 3-0- up to 3-3-
RewriteCond %{REQUEST_URI} /3-[0-9]+-([0-3])\.png
RewriteRule (.*) white.png [L]
# 2-0- up to 2-1-
RewriteCond %{REQUEST_URI} /2-[0-9]+-([0-1])\.png
RewriteRule (.*) white.png [L]
# 1-0- up to 1-1-
RewriteCond %{REQUEST_URI} /1-[0-9]+-0\.png
RewriteRule (.*) white.png [L]
RewriteRule (.*) black.png [L]
Rewrite URL for missing resource
From [4], rewrite URL for missing resource.
# For each web request (file or directory) that doesn't start with /en-US/,
# serve up the original resource if it exists, otherwise serve up the /en-US/ version.
RewriteCond $0 !^en-US/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .+ en-US/$0 [L]
Tags
DirectoryIndex
- Use DirectoryIndex to change list of default name of index file while browsing directory
DirectoryIndex index.php index.html # Will serve php version first
DirectoryIndex mycustomindex.html # To point to specific file when browsing directory (no directory listing)
HTTPS
From [5]. Assumptions:
- Already a website present at /var/www
- Package ssl-cert installed (that create snakeoil (i.e. self-signed) certificates in /etc/ssl)
# Load and enable SSL module
sudo a2enmod ssl
sudo /etc/init.d/apache2 force-reload
# Edit file
sudo vim /etc/apache2/sites-available/default-ssl
# ... and change lines as follows (for key/cert we use the snakeoil ones):
# SSLEngine on
# SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
#Enable the default SSL site:
sudo a2ensite default-ssl
# Tell Apache to reload its configuration:
sudo /etc/init.d/apache2 reload
To also add user authentication, add the following lines to either
- File .htaccess in website directory
- Section <Directory /> in /etc/apache2/sites-available/default-ssl:
AuthType Basic
AuthName "default"
AuthUserFile /var/www/nxl67002ux.ssl.passwd
Require valid-user
Then create the password file with the command htpasswd -c filename.passwd username
Finally, reload apache2:
sudo /etc/init.d/apache2 reload