Forum Moderators: phranque
<Files *>
order deny,allow
# Block Address Country 1**
deny from omitted
# Block Address Country 2**
deny from omitted
# Block Address Country 3**
deny from omitted
# Block Address Country 4**
deny from omitted
# Block Address Country 5**
deny from omitted
# Block Address Country 6**
deny from omitted
# Block Address Country 7**
deny from omitted
# Block Address Country 8**
deny from omitted
# Block Address Country 9**
deny from omitted
# Block Address Country 10**
deny from omitted
# Block Address Country 11**
deny from omitted
# Block Address Country 12**
deny from omitted
# Block Address Country 13**
deny from omitted
# End blocklist
</Files>
# Deny viewing of .htaccess directives:
<Files .htaccess>
deny from all
</Files>
DirectoryIndex portal.php index.php index.html index.htm
# Lines That should already be in your .htacess
#
# Uncomment the statement below if you want to make use of
# HTTP authentication and it does not already work.
# This could be required if you are for example using PHP via Apache CGI.
#
#<IfModule mod_rewrite.c>
#RewriteEngine on
#RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
#</IfModule>
<Files "config.php">
Order Allow,Deny
Deny from All
</Files>
<Files "common.php">
Order Allow,Deny
Deny from All
</Files>
# You may need to un-comment the following lines
# Options +FollowSymlinks
# To make sure that rewritten dir or file (/|.html) will not load dir.php in case it exist
# Options -MultiViews
# REMEBER YOU ONLY NEED TO STARD MOD REWRITE ONCE
RewriteEngine On
# Uncomment the statement below if you want to make use of
# HTTP authentication and it does not already work.
# This could be required if you are for example using PHP via Apache CGI.
# RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
# REWRITE BASE
RewriteBase /
# HERE IS A GOOD PLACE TO FORCE CANONICAL DOMAIN
#RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
#RewriteRule ^(.*)$ http://www.example.com/$1 [QSA,L,R=301]
# DO NOT GO FURTHER IF THE REQUESTED FILE / DIR DOES EXISTS
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . - [L]
#####################################################
# PHPBB SEO REWRITE RULES ALL MODES
#####################################################
# FORUMS PAGES
###############
# FORUM INDEX REWRITERULE WOULD STAND HERE IF USED. "forum" REQUIRES TO BE SET AS FORUM INDEX
RewriteRule ^forum\.html$ index.php [QSA,L,NC]
# FORUM ALL MODES
RewriteRule ^(forum|[a-z0-9_-]*-f)([0-9]+)/?(page([0-9]+)\.html)?$ viewforum.php?f=$2&start=$4 [QSA,L,NC]
# TOPIC WITH VIRTUAL FOLDER ALL MODES
RewriteRule ^(forum|[a-z0-9_-]*-f)([0-9]+)/(topic|[a-z0-9_-]*-t)([0-9]+)(-([0-9]+))?\.html$ viewtopic.php?f=$2&t=$4&start=$6 [QSA,L,NC]
# GLOBAL ANNOUNCES WITH VIRTUAL FOLDER ALL MODES
RewriteRule ^announces/(topic|[a-z0-9_-]*-t)([0-9]+)(-([0-9]+))?\.html$ viewtopic.php?t=$2&start=$4 [QSA,L,NC]
# TOPIC WITHOUT FORUM ID & DELIM ALL MODES
RewriteRule ^([a-z0-9_-]*)/?(topic|[a-z0-9_-]*-t)([0-9]+)(-([0-9]+))?\.html$ viewtopic.php?forum_uri=$1&t=$3&start=$5 [QSA,L,NC]
# PHPBB FILES ALL MODES
RewriteRule ^resources/[a-z0-9_-]+/(thumb/)?([0-9]+)$ download/file.php?id=$2&t=$1 [QSA,L,NC]
# PROFILES ALL MODES WITH ID
#RewriteRule ^(member|[a-z0-9_-]*-u)([0-9]+)/$ memberlist.php?mode=viewprofile&u=$2 [QSA,L,NC]
RewriteRule ^member/([^/]+)/?$ /memberlist.php?mode=viewprofile&un=$1 [QSA,L,NC]
# USER MESSAGES ALL MODES WITH ID
RewriteRule ^(member|[a-z0-9_-]*-u)([0-9]+)/(topics|posts)/?(page([0-9]+)\.html)?$ search.php?author_id=$2&sr=$3&start=$5 [QSA,L,NC]
# GROUPS ALL MODES
RewriteRule ^(group|[a-z0-9_-]*-g)([0-9]+)(-([0-9]+))?\.html$ memberlist.php?mode=group&g=$2&start=$4 [QSA,L,NC]
# POST
RewriteRule ^post([0-9]+)\.html$ viewtopic.php?p=$1 [QSA,L,NC]
# ACTIVE TOPICS
RewriteRule ^active-topics(-([0-9]+))?\.html$ search.php?search_id=active_topics&start=$2&sr=topics [QSA,L,NC]
# UNANSWERED TOPICS
RewriteRule ^unanswered(-([0-9]+))?\.html$ search.php?search_id=unanswered&start=$2&sr=topics [QSA,L,NC]
# NEW POSTS
RewriteRule ^newposts(-([0-9]+))?\.html$ search.php?search_id=newposts&start=$2&sr=topics [QSA,L,NC]
# THE TEAM
RewriteRule ^the-team\.html$ memberlist.php?mode=leaders [QSA,L,NC]
# HERE IS A GOOD PLACE TO ADD OTHER PHPBB RELATED REWRITERULES
#####################################################
# GYM Sitemaps & RSS
# Global channels
RewriteRule ^rss(/(news)+)?(/(digest)+)?(/(short|long)+)?/?$ /gymrss.php?channels&$2&$4&$6 [QSA,L,NC]
# HTML Global news & maps
RewriteRule ^(news|maps)/?(page([0-9]+)\.html)?$ /map.php?$1&start=$3 [QSA,L,NC]
# END GYM Sitemaps & RSS
#####################################################
# FORUM WITHOUT ID & DELIM ALL MODES (SAME DELIM)
# THESE THREE LINES MUST BE LOCATED AT THE END OF YOUR HTACCESS TO WORK PROPERLY
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z0-9_-]+)/?(page([0-9]+)\.html)?$ viewforum.php?forum_uri=$1&start=$3 [QSA,L,NC]
# FIX RELATIVE PATHS : FILES
RewriteRule ^.+/(style\.php|ucp\.php|mcp\.php|faq\.php|download/file.php)$ $1 [QSA,L,NC,R=301]
# FIX RELATIVE PATHS : IMAGES
RewriteRule ^.+/(styles/.*|images/.*)/$ $1 [QSA,L,NC,R=301]
# END PHPBB PAGES
#####################################################
#####################################################
# BEGIN PORTALXL
RewriteRule ^portal\.html$ /portal.php [QSA,L,NC]
RewriteRule ^portal-([0-9]+)\.html$ /portal.php?start=$1 [QSA,L,NC]
RewriteRule ^calendar\.html$ /calendar.php [QSA,L,NC]
RewriteRule ^downloads\.html$ /downloads.php [QSA,L,NC]
RewriteRule ^arcade\.html$ /arcade.php [QSA,L,NC]
# END PORTALXL
#####################################################
#####################################################
# BEGIN USER BLOG MOD
RewriteRule ^blog/(.+)/(.+)\.html$ /blog/view/blog.php?page=$1&mode=$2 [QSA,L,NC]
RewriteRule ^blog/(.+)/$ /blog/view/blog.php?page=$1 [QSA,L,NC]
RewriteRule ^blog/$ /blog/blog.php [QSA,L,NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^blog/(.+)/(.+)$ /blog/view/blog.php?page=$1&mode=$2 [QSA,L,NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^blog/(.+)$ /blog/blog.php?page=$1 [QSA,L,NC]
# USER BLOG MOD ATTACHMENTS/PROFILE AVATAR FIX
RewriteRule ^blog/(.+)/(.+)_id-([0-9]+)\.html/(.+)$ /blog/view/blog.php?page=$1&mode=$2&id=$3/$4 [QSA,L,NC]
RewriteRule ^blog/images/avatars/no_avatar\.png$ /images/avatars/no_avatar.png [QSA,L,NC]
RewriteRule ^blog/(.+)/images/avatars/no_avatar\.png$ /images/avatars/no_avatar.png [QSA,L,NC]
# END USER BLOG MOD
#####################################################
#####################################################
# PHPBB GALLERY REWRITE RULES
# ALBUM INDEX
#RewriteRule ^gallery/$ /gallery/index.php [QSA,L,NC]
RewriteRule ^gallery/album\.html$ /gallery/index.php [QSA,L,NC]
# ALBUM
RewriteRule ^gallery/[a-z0-9_-]*-a([0-9]+)/?(page([0-9]+)\.html)?$ /gallery/album.php?album_id=$1&start=$3 [QSA,L,NC]
# PERSONAL ALBUMS
RewriteRule ^gallery/user-albums/?(page([0-9]+)\.html)?$ /gallery/index.php?mode=personal&start=$2 [QSA,L,NC]
# PIC PAGE
RewriteRule ^gallery/[a-z0-9_-]*(-a([0-9]+)/)?[a-z0-9_-]*-p([0-9]+)(-([0-9]+))?\.html$ /gallery/image_page.php?album_id=$2&image_id=$3&start=$5 [QSA,L,NC]
# JGP
RewriteRule ^gallery/[a-z0-9_-]*(-a([0-9]+)/)?[a-z0-9_-]*-i([0-9]+)\.jpg$ /gallery/image.php?album_id=$2&image_id=$3 [QSA,L,NC]
# JGP THUMBNAILS
RewriteRule ^gallery/[a-z0-9_-]*(-a([0-9]+)/)?[a-z0-9_-]*-t([0-9]+)\.jpg$ /gallery/image.php?mode=thumbnail&album_id=$2&image_id=$3 [QSA,L,NC]
# JGP MEDIUM
RewriteRule ^gallery/[a-z0-9_-]*(-a([0-9]+)/)?[a-z0-9_-]*-m([0-9]+)\.jpg$ /gallery/image.php?mode=medium&album_id=$2&image_id=$3 [QSA,L,NC]
# END PHPBB GALLERY
#####################################################
#####################################################
# GYM Sitemaps & RSS
# HTML Module additional modes
RewriteRule ^(news|maps)/([a-z0-9_-]+)(/([a-z0-9_-]+))?/?(page([0-9]+)\.html)?$ /map.php?$2=$4&$1&start=$6 [QSA,L,NC]
# Main feeds & channels
RewriteRule ^rss(/(news)+)?(/(digest)+)?(/(short|long)+)?(/([a-z0-9_-]+))?/([a-z0-9_]+)\.xml(\.gz)?$ /gymrss.php?$9=$8&$2&$4&$6&gzip=$10 [QSA,L,NC]
# Module feeds
RewriteRule ^[a-z0-9_-]*-[a-z]{1,2}([0-9]+)(/(news)+)?(/(digest)+)?(/(short|long)+)?/([a-z0-9_]+)\.xml(\.gz)?$ /gymrss.php?$8=$1&$3&$5&$7&gzip=$9 [QSA,L,NC]
# Module feeds without ids
RewriteRule ^([a-z0-9_-]+)(/(news)+)?(/(digest)+)?(/(short|long)+)?/([a-z0-9_]+)\.xml(\.gz)?$ /gymrss.php?nametoid=$1&$3&$5&$7&modulename=$8&gzip=$9 [QSA,L,NC]
# Google SitemapIndex
RewriteRule ^sitemapindex\.xml(\.gz)?$ /sitemap.php?gzip=$1 [QSA,L,NC]
# Module cat sitemaps
RewriteRule ^[a-z0-9_-]+-([a-z]{1,2})([0-9]+)\.xml(\.gz)?$ /sitemap.php?module_sep=$1&module_sub=$2&gzip=$3 [QSA,L,NC]
# Module sitemaps
RewriteRule ^([a-z0-9_]+)-([a-z0-9_-]+)\.xml(\.gz)?$ /sitemap.php?$1=$2&gzip=$3 [QSA,L,NC]
# END GYM Sitemaps & RSS
#####################################################
#### Begin Security Section #########
RewriteRule setup\.php$ - [F]
# block pre-fetch requests with X-moz headers
RewriteCond %{ENV:no_access} yes
RewriteRule .* - [F,L]
#REQUEST METHOD
RewriteCond %{REQUEST_METHOD} ^(delete|head|trace|track) [NC]
RewriteRule ^(.*)$ - [F,L]
RewriteCond %{HTTP_COOKIE} ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC]
RewriteRule ^(.*)$ - [F,L]
RewriteCond %{THE_REQUEST} ^.*(\\r|\\n|%0A|%0D).* [NC]
RewriteRule ^(.*)$ - [F,L]
# proc/self/environ? no way!
RewriteCond %{QUERY_STRING} proc/self/environ [OR]
# Block out any script trying to set a mosConfig value through the URL
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR]
# Block out any script trying to base64_encode crap to send via URL
RewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR]
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR]
# Block out any script that includes a <script> tag in URL
RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
# Block out any script trying to set a PHP GLOBALS variable via URL
RewriteCond %{QUERY_STRING} GLOBALS(=|[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
# Block out any script trying to modify a _REQUEST variable via URL
RewriteCond %{QUERY_STRING} _REQUEST(=|[|\%[0-9A-Z]{0,2})
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
# Send all blocked request to homepage with 403 Forbidden error!
RewriteRule ^(.*)$ index.php [F,L]
# phpMyAdmin
RewriteRule ^/phpMyAdmin.*$ /index.php
#
SetEnvIfNoCase user-Agent "windows 95" ban
SetEnvIfNoCase user-Agent "windows 98" ban
SetEnvIfNoCase user-Agent "windows NT" ban
SetEnvIfNoCase Referer "\.cn" ban
SetEnvIfNoCase Referer "\.ro" ban
SetEnvIfNoCase Referer "\.ru" ban
SetEnvIfNoCase Referer "\.es" ban
SetEnvIfNoCase Referer "\.id" ban
SetEnvIfNoCase Referer "\.in" ban
SetEnvIf Request_URI "\.php" ban
SetEnvIf Request_URI "(robots\.txt)$" pass
SetEnvIfNoCase X-forwarded-for .+ proxy=yes
SetEnvIfNoCase X-moz prefetch no_access=yes
SetEnvIfNoCase user-Agent libwww-perl bad_bots
order deny,allow
deny from env=bad_bots
#
<FilesMatch "\.(cgi|pl|py|txt)">
Deny from all
</FilesMatch>
########### End Security Section!########################
AddType text/html .shtml
AddHandler server-parsed .htm .html .shtml
Header append X-robots-tag "noarchive"
#Needed on mine, most use FollowSymLinks
Options SymLinksIfOwnerMatch Includes
#Each below is example, no more than a dozen each type
SetEnvIfNoCase User-Agent "^$" ban
SetEnvIfNoCase Referer "translate" ban
SetEnvIf Request_URI "\.php" ban
#Pipe Include custom 404 in next line if you use one
SetEnvIf Request_URI "(robots\.txt)$" pass
Order Deny,Allow
<FilesMatch "\.(htaccess|htpasswd)$">
Deny from all
</FilesMatch>
<LimitExcept GET POST>
Deny from all
</LimitExcept>
<Limit GET POST>
Deny from 173.192.0.0/15
Deny from env=ban
Allow from env=pass
</Limit>
redirectPermanent /example/folder/file.html http://www.example.com/folder/otherfile.html
# Start of Blocking User-Agents/Referers
SetEnvIfNoCase user-Agent "windows 95" ban
SetEnvIfNoCase user-Agent "windows 98" ban
SetEnvIfNoCase user-Agent "windows NT" ban
# Not sure about the libwww-perl but?
SetEnvIfNoCase user-Agent libwww-perl ban
SetEnvIfNoCase Referer "\.cn" ban
SetEnvIfNoCase Referer "\.ro" ban
SetEnvIfNoCase Referer "\.ru" ban
SetEnvIfNoCase Referer "\.es" ban
SetEnvIfNoCase Referer "\.id" ban
SetEnvIfNoCase Referer "\.in" ban
# I think the below statement blocks .php requests? not correct
SetEnvIf Request_URI "\.php" ban
# Not sure if the lines below are actually blocking proxy connections
SetEnvIfNoCase X-forwarded-for .+ proxy=yes
SetEnvIfNoCase X-moz prefetch no_access=yes
# Allow robots.txt
SetEnvIf Request_URI "(robots\.txt)$" pass
order deny,allow
<Limit GET POST>
Deny from env=ban
Allow from env=pass
</Limit>
SetEnvIfNoCase user-Agent "windows 95" ban
SetEnvIfNoCase user-Agent "windows95" ban
SetEnvIfNoCase user-Agent "win95" ban
SetEnvIfNoCase user-Agent "win 95" ban
SetEnvIfNoCase user-Agent "windows 98" ban
SetEnvIfNoCase user-Agent "windows98" ban
SetEnvIfNoCase user-Agent "win 98" ban
SetEnvIfNoCase user-Agent "win98" ban
SetEnvIfNoCase user-Agent "windows 3.11" ban
SetEnvIfNoCase user-Agent "windows 3.1" ban
SetEnvIfNoCase user-Agent "windows 3.0" ban
SetEnvIfNoCase user-Agent "windows me" ban
SetEnvIfNoCase user-Agent "windows NT 5.0" ban
SetEnvIfNoCase Referer "\.cn" ban
SetEnvIfNoCase Referer "\.ro" ban
SetEnvIfNoCase Referer "\.ru" ban
SetEnvIfNoCase Referer "\.es" ban
SetEnvIfNoCase Referer "\.id" ban
SetEnvIfNoCase Referer "\.in" ban
SetEnvIfNoCase user-Agent "libwww-perl" ban
SetEnvIf Request_URI "(robots\.txt)$" pass
<FilesMatch "(.*)">
order deny,allow
deny from env=ban
allow from pass
</FilesMatch>
SetEnvIfNoCase user-Agent "win(dows)?(\ )?9[58]" ban
SetEnvIfNoCase Referer "^https?://[^/]+\.(cn|ro|ru|es|id|in)" ban
Denying by IP address isn't as useful as the other things, unless an IP range is swamping your server with requests that you can't block any other way.