Votre avis/critiques sur mon .htaccess

S
StefouFR
Guest
Bonsoir à tous,

Je posséde un serveur dédié sous Windows Server 2008 R2 (1&1) pour du Apache/Mysql par Xampp.

Je ne m'y connais pas trop en .htaccess.

Pouvez-vous me donner votre avis sur mon .htaccess actuel ?

Le but est d'avoir quelque chose de sécurisé et aussi d'optimisé "SEO", par exemple avec le cache, les expirations, compression, redirection, etc.

J'héberge un site de jeu en ligne avec base de données, forum, etc.

Code:
SetEnv REGISTER_GLOBALS 0

RewriteEngine On
RewriteCond %{HTTP_HOST} !^MON_DOMAINE\.com$ [NC] 
RewriteRule ^(.*)$ http://MON_DOMAINE.com/$1 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
RewriteCond %{HTTP_USER_AGENT} libwww-perl.* 
RewriteRule .* ? [F,L]

ErrorDocument 403 http://MON_DOMAINE.com/
ErrorDocument 404 http://MON_DOMAINE.com/

<IfModule mod_headers.c>
Header set X-XSS-Protection "1; mode=block"
</IfModule>

#Check to see if browser can accept gzip files. If so and we have it – serve it!
ReWriteCond %{HTTP:accept-encoding} gzip
RewriteCond %{HTTP_USER_AGENT} !Safari
#make sure there’s no trailing .gz on the url
ReWriteCond %{REQUEST_FILENAME} !^.+.gz$
#check to see if a .gz version of the file exists.
RewriteCond %{REQUEST_FILENAME}.gz -f
#All conditions met so add .gz to URL filename (invisibly)
RewriteRule ^(.+) $1.gz [QSA,L]
<ifmodule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_keep_workfiles No
mod_gzip_can_negotiate Yes
mod_gzip_add_header_count Yes
mod_gzip_send_vary Yes
mod_gzip_command_version ‘/mod_gzip_status’
mod_gzip_min_http 1000
mod_gzip_minimum_file_size 300
mod_gzip_maximum_file_size 512000
mod_gzip_maximum_inmem_size 60000
mod_gzip_handle_methods GET POST
mod_gzip_temp_dir /tmp
mod_gzip_item_include file .html$
mod_gzip_item_include file .php$
mod_gzip_item_include file .pl$
mod_gzip_item_include file .rb$
mod_gzip_item_include file .py$
mod_gzip_item_include file .cgi$
mod_gzip_item_include file .css$
mod_gzip_item_include file .js$
mod_gzip_item_include mime ^application/javascript$
mod_gzip_item_include mime ^application/x-javascript$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^httpd/unix-directory$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include handler ^server-status$
mod_gzip_item_include handler ^server-info$
mod_gzip_item_include handler ^application/x-httpd-php
mod_gzip_item_exclude mime ^image/.*
</ifmodule>

# BEGIN Expire headers
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 7200 seconds"
ExpiresByType image/jpg "access plus 2592000 seconds"
ExpiresByType image/jpeg "access plus 2592000 seconds"
ExpiresByType image/png "access plus 2592000 seconds"
ExpiresByType image/gif "access plus 2592000 seconds"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 2592000 seconds"
ExpiresByType image/icon "access plus 2592000 seconds"
ExpiresByType image/x-icon "access plus 2592000 seconds"
ExpiresByType text/css "access plus 2592000 seconds"
ExpiresByType text/javascript "access plus 2592000 seconds"
ExpiresByType text/html "access plus 7200 seconds"
ExpiresByType application/xhtml+xml "access plus 7200 seconds"
ExpiresByType application/javascript A259200
ExpiresByType application/x-javascript "access plus 2592000 seconds"
ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
</IfModule>
# END Expire headers

# BEGIN Cache-Control Headers
<IfModule mod_headers.c>
<FilesMatch "\\.(ico|jpe?g|png|gif|swf|gz|ttf)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
<FilesMatch "\\.(css)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
<FilesMatch "\\.(js)$">
Header set Cache-Control "max-age=2592000, private"
</FilesMatch>
<filesMatch "\\.(html|htm)$">
Header set Cache-Control "max-age=7200, public"
</filesMatch>
# Disable caching for scripts and other dynamic files
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>
</IfModule>
# END Cache-Control Headers

# KILL THEM ETAGS
 Header unset ETag
 FileETag none
 
 # protect the htaccess file
<files .htaccess>
order allow,deny
deny from all
</files>

# protection de la lecture des répertoires
Options -Indexes

# désactivation de la recherche implicite du serveur
Options -Multiviews

A voir s'il y a des trucs "faux" ou inutile ou manquant ?

Merci à vous, peut-être que cela servira à d'autres webmasters,
StefouFR.
 
S
StefouFR
Guest
.htaccess V2, je pense qu'il sera mieux que le premier.

Les directives pouvant être réglées directement dans le php.ini et le httpd.conf du serveur dédié sont retirées.
Code:
# Protéger les fichiers .htaccess et .htpasswds
<Files ~ "^.*\.([Hh][Tt][AaPp])">
order allow,deny
deny from all
satisfy all
</Files>

# Rediriger vers la version sans www
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.MON_DOMAINE\.com [NC]
RewriteRule ^(.*)$ http://MON_DOMAINE.com/$1 [L,R=301]

# Rediriger index.php vers la racine
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

# Protection contre les bots lib
RewriteCond %{HTTP_USER_AGENT} libwww [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)=http [NC]
RewriteRule ^(.*)$ – [F,L]

# Rediriger une erreur vers la racine
ErrorDocument 403 http://MON_DOMAINE.com/
ErrorDocument 404 http://MON_DOMAINE.com/

## contrôle du cache navigateur - Expire headers  
    <IfModule mod_expires.c>  
        ExpiresActive On  
        ExpiresDefault "access plus 7200 seconds"  
        ExpiresByType image/jpg             "access plus 1 week"  
        ExpiresByType image/jpeg            "access plus 1 week"  
        ExpiresByType image/png             "access plus 1 week"  
        ExpiresByType image/gif             "access plus 1 week"  
        AddType image/x-icon .ico  
        ExpiresByType image/ico             "access plus 1 week"  
        ExpiresByType image/icon            "access plus 1 week"  
        ExpiresByType image/x-icon          "access plus 1 week"  
        ExpiresByType text/css              "access plus 1 week"  
        ExpiresByType text/javascript       "access plus 1 week"  
        ExpiresByType text/html             "access plus 7200 seconds"  
        ExpiresByType application/xhtml+xml     "access plus 7200 seconds"  
        ExpiresByType application/javascript    "access plus 1 week"  
        ExpiresByType application/x-javascript  "access plus 1 week"  
        ExpiresByType application/x-shockwave-flash "access plus 1 week"  
    </IfModule>

# En-têtes
Header unset ETag
FileETag None

## Mise en cache cache-control
	<IfModule mod_headers.c>
	<FilesMatch "\\.(ico|jpe?g|png|gif|swf)$">
		Header set Cache-Control "max-age=2592000, public"
	</FilesMatch>
	<FilesMatch "\\.(css)$">
		Header set Cache-Control "max-age=2592000, public"
	</FilesMatch>
	<FilesMatch "\\.(js)$">
		Header set Cache-Control "max-age=2592000, private"
	</FilesMatch>
	<FilesMatch "\\.(x?html?|php)$">
		Header set Cache-Control "max-age=600, private, must-revalidate"
	</FilesMatch>

# Compressions des fichiers statiques
<IfModule mod_deflate.c> 
    AddOutputFilterByType DEFLATE text/xhtml text/html text/plain text/xml text/javascript application/x-javascript text/css 
    BrowserMatch ^Mozilla/4 gzip-only-text/html 
    BrowserMatch ^Mozilla/4\.0[678] no-gzip 
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html 
    SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary 
    Header append Vary User-Agent env=!dont-vary 
</IfModule>

AddOutputFilterByType DEFLATE text/html  
AddOutputFilterByType DEFLATE text/plain  
AddOutputFilterByType DEFLATE text/xml  
AddOutputFilterByType DEFLATE text/css  
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/json

# Protection contre les injections de fichiers
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC]
RewriteRule .* - [F]

# Protections diverses (XSS, clickjacking et MIME-Type sniffing)
<ifModule mod_headers.c>
Header set X-XSS-Protection "1; mode=block"
Header always append X-Frame-Options SAMEORIGIN
Header set X-Content-Type-Options: "nosniff”
</ifModule>

En espérant lire vos avis pour l'améliorer/l'optimiser :).
 
S
StefouFR
Guest
V3 (fix and clean code).

Code:
# Protéger les fichiers .htaccess et .htpasswds
<Files ~ "^.*\.([Hh][Tt][AaPp])">
order allow,deny
deny from all
satisfy all
</Files>

# Rediriger vers la version sans www
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.MON_DOMAINE\.com [NC]
RewriteRule ^(.*)$ http://MON_DOMAINE.com/$1 [L,R=301]

# Rediriger index.php vers la racine
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

# Protection contre les bots lib
RewriteCond %{HTTP_USER_AGENT} libwww [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)=http [NC]
RewriteRule ^(.*)$ – [F,L]

# Rediriger une erreur vers la racine
ErrorDocument 403 http://MON_DOMAINE.com/
ErrorDocument 404 http://MON_DOMAINE.com/

# Mise en cache des fichiers dans le navigateur
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 month"
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType application/pdf "access plus 0 seconds"
ExpiresByType application/rss+xml "access plus 1 hour"
ExpiresByType application/atom+xml "access plus 1 hour"
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType application/x-font-woff "access plus 1 month"
ExpiresByType application/x-font-woff2 "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType video/ogg "access plus 1 month"
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/webm "access plus 1 month"
ExpiresByType text/css "access plus 6 month"
ExpiresByType application/javascript "access plus 6 month"
ExpiresByType application/x-shockwave-flash "access plus 1 week"
ExpiresByType image/x-icon "access plus 1 week"
</IfModule>

# En-têtes
Header unset ETag
FileETag None

# Mise en cache cache-control
<IfModule mod_headers.c>
<FilesMatch "\\.(ico|jpe?g|png|gif|swf)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
<FilesMatch "\\.(css)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
<FilesMatch "\\.(js)$">
Header set Cache-Control "max-age=2592000, private"
</FilesMatch>
<FilesMatch "\\.(x?html?|php)$">
Header set Cache-Control "max-age=600, private, must-revalidate"
</FilesMatch>

# Compressions des fichiers statiques
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/xhtml text/html text/plain text/xml text/javascript application/x-javascript text/css
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
Header append Vary User-Agent env=!dont-vary
</IfModule>

AddOutputFilterByType DEFLATE text/html 
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/x-javascript

# Protection contre les injections de fichiers
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC]
RewriteRule .* - [F]

# Protections diverses (XSS, clickjacking et MIME-Type sniffing)
<ifModule mod_headers.c>
Header set X-XSS-Protection "1; mode=block"
Header always append X-Frame-Options SAMEORIGIN
Header set X-Content-Type-Options: "nosniff"
</ifModule>

PS : si un modérateur peut réorganiser mon topic c'est avec grand plaisir, car je ne peux pas éditer mon tout premier post.
 
Nouveau WRInaute
Hello

Tiens quelques règles sympas en plus.
A adapter pour ton site.
Surement des conditions à rajouter, surveiller les 403 illégitimes pendant quelques jours.

Code:
# DOS
LimitRequestBody 10240000

<Files ~ ".(inc|class|sql|ini|conf|exe|dll|bin|tpl|bkp|dat|c|h|py|spd|theme|module|xml)$">
deny from all
</Files>

<Files sitemap.xml>
allow from all
</Files>

<IfModule mod_rewrite.c>
RewriteEngine on  RewriteBase /

#PHP EASTER EGGS 403
RewriteCond %{QUERY_STRING} \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC]
RewriteRule .* - [F]

#BLOCK XSS / SQL INJECTION 403
RewriteCond %{REQUEST_METHOD} (GET|POST) [NC]
RewriteCond %{QUERY_STRING} ^(.*)(%3C|<)/?script(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(%3D|=)?javascript(%3A|:)(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)document\.location\.href(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)(%3D|=)http(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)GLOBALS(=|[|%[0-9A-Z]{0,2})(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)_REQUEST(=|[|%[0-9A-Z]{0,2})(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)(SELECT(%20|\+)|UNION(%20|\+)ALL|INSERT(%20|\+)|DELETE(%20|\+)|CHAR\(|UPDATE(%20|\+)|REPLACE(%20|\+)|LIMIT(%20|\+))(.*)$ [NC]
RewriteRule (.*) - [F]

#HOTLINKING 403
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_HOST}   !^www\.example\.com [NC]
RewriteCond %{HTTP_REFERER} !^.*(translate|paypal|google|bing|yahoo|yandex|baidu|facebook|qwant|duck|ixquick|pinterest|twitter).*$ [NC]
RewriteRule \.(ico|pdf|jpg|jpeg|png|gif|css|js)$ - [F,NS,L]

#BAD REQUEST 403
RewriteCond %{REQUEST_METHOD} !^(GET|POST)$ [NC]
RewriteRule .* - [F,NS,L]

#REQUEST WITHOUT HOSTNAME 403
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1
RewriteCond %{HTTP_USER_AGENT} !(PayPal|googlebot|bingbot|DuckDuckBot|Yahoo|msnbot|Exabot|OrangeBot) [NC]
RewriteCond %{HTTP_HOST} ^$
RewriteRule .* - [F,NS,L]

#FICHIERS SENSIBLES 403
RewriteRule ^(htaccess\.txt|web\.config\.txt|configuration\.php(-dist)?|php\.ini)$ - [F]

#SEULEMENT FICHIERS jpg|js|css|html|txt|etc... AUTORISES SINON 403
RewriteRule ^(repertoire1|repertoire2|repertoire3|repertoire4|repertoire5)/([^/]+/)*([^/.]+\.)+(jpg|JPG|png|gif|css|js|html|txt|ico|eot|woff|woff2|ttf|svg)$ - [L]
RewriteRule ^(repertoire1|repertoire2|repertoire3|repertoire4|repertoire5)/ - [F]

#SEULEMENT FICHIERS PHP AUTORISES SINON 403
RewriteCond %{REQUEST_FILENAME} \.php$
RewriteCond %{REQUEST_FILENAME} !/index\.php$
RewriteRule ^([^/]+/)*([^/.]+\.)+php$ - [F]

#BAD REFERER 403
RewriteCond %{HTTP_REFERER} ^.*(ilovevitaly|econom|darodar|iskalko|o-o-8-o-o|o-o-6-o-o|buttons|cenoval|priceg|cenokos|seoexperimenty|gobongo|vodkoved|erot|hongfanji).*\..* [NC,OR]
RewriteCond %{HTTP_REFERER} ^.*(adcash|websocial|cityadspix|luxup|ykecwqlixx|superiends|slftsdybbg|edakgfvwql|socialseet|screentoolkit|savetubevideo|7makemoneyonline|hulfingtonpost).*\..* [NC,OR]
RewriteCond %{HTTP_REFERER} ^.*(12masterov|este-line|bestwebsitesawards|cardiosport|customsua|ghazel|maridan|med-zdorovie|dipstar|it-max|delfin-aqua|dvr|blackhatworth|video--production).*\..* [NC,OR]
RewriteCond %{HTTP_REFERER} ^.*(humanorightswatch|aliexpress|best-seo-solution|googlsucks|best-seo-offer|theguardlan|chinese-amezon|sexyali|qualitymarketzone|website|topseoservices).*\..* [NC,OR]
RewriteCond %{HTTP_REFERER} ^.*(buy-cheap-online|guardlink|event-tracking|100dollars-seo|sanjosestartups|howtostopreferralspam|непереводимая|success-seo|traffic|clicksor).*\..* [NC,OR]
RewriteCond %{HTTP_REFERER} ^.*(videos-for-your-business|alibestsale|copyrightclaims|snip|adf|quit-smoking|googlemare|santasgift|rusexy|cyber-monday).*\..* [NC]
RewriteRule .* – [F]

#BAD USER AGENT 403
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(atraxbot|Azureus|geohasher|PycURL|Python-urllib|research-scan-bot|Sosospider|Wget|xenu|casper|goblox|sun4u|ZmEu|java|curl|wget).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner|libwww-perl|python|nikto|scan).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]
#BOTS CHIANTS
RewriteCond %{HTTP_USER_AGENT} ^.*(MJ12bot|SeznamBot|Baiduspider|Yandex|AhrefsBot|XoviBot).* [NC]
RewriteRule ^(.*)$ - [F]

</IfModule>
 
S
StefouFR
Guest
Intéressant !

Je vais étudier immédiatement ton post, merci beaucoup d'avoir prit le temps ;-).
 
Discussions similaires
Haut