Как через Htaccess ограничить доступ к сайту по ip

RewriteCond %{HTTP_HOST} ^Вашсайт\.зона$
RewriteCond %{REMOTE_ADDR} !^Ваш ip$
RewriteRule .* - [F] 

Почему не Deny?
А потому что Deny режет все, а мой пример - только указанный домен

Если нужно разрешить несколько IP

RewriteCond %{REMOTE_ADDR} !^Ваш ip$ [or]
RewriteCond %{REMOTE_ADDR} !^Ваш ip2$
RewriteCond %{HTTP_HOST} ^Вашсайт\.зона$
RewriteRule .* - [F] 

Как? Пришлось смотреть в исходники mod_rewrite.c

Оставлено здесь, пусть полежит. Может получится собрать коллекцию

#Удаление повторящихся слешей в URL

RewriteCond %{THE_REQUEST} //
RewriteRule .* /$0 [R=301,L]

#Если хоть один в CAPS пропустим следующее правило
RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]

#все малые - пропускаем 28 правил
RewriteRule ![A-Z] - [S=28]

RewriteRule ^([^A]*)A(.*)$ $1a$2
RewriteRule ^([^B]*)B(.*)$ $1b$2
RewriteRule ^([^C]*)C(.*)$ $1c$2
RewriteRule ^([^D]*)D(.*)$ $1d$2
RewriteRule ^([^E]*)E(.*)$ $1e$2
RewriteRule ^([^F]*)F(.*)$ $1f$2
RewriteRule ^([^G]*)G(.*)$ $1g$2
RewriteRule ^([^H]*)H(.*)$ $1h$2
RewriteRule ^([^I]*)I(.*)$ $1i$2
RewriteRule ^([^J]*)J(.*)$ $1j$2
RewriteRule ^([^K]*)K(.*)$ $1k$2
RewriteRule ^([^L]*)L(.*)$ $1l$2
RewriteRule ^([^M]*)M(.*)$ $1m$2
RewriteRule ^([^N]*)N(.*)$ $1n$2
RewriteRule ^([^O]*)O(.*)$ $1o$2
RewriteRule ^([^P]*)P(.*)$ $1p$2
RewriteRule ^([^Q]*)Q(.*)$ $1q$2
RewriteRule ^([^R]*)R(.*)$ $1r$2
RewriteRule ^([^S]*)S(.*)$ $1s$2
RewriteRule ^([^T]*)T(.*)$ $1t$2
RewriteRule ^([^U]*)U(.*)$ $1u$2
RewriteRule ^([^V]*)V(.*)$ $1v$2
RewriteRule ^([^W]*)W(.*)$ $1w$2
RewriteRule ^([^X]*)X(.*)$ $1x$2
RewriteRule ^([^Y]*)Y(.*)$ $1y$2
RewriteRule ^([^Z]*)Z(.*)$ $1z$2

# А это? Вдруг не полчилось? Давай начнем сначала
RewriteRule [A-Z] - [N]

RewriteCond %{ENV:HASCAPS} TRUE
RewriteRule ^/?(.*) /$1 [R=301,L]

Не, ну а что? очень прикольно. Но не радуйтесь.. ЭТО работает частично

А как заставить не частично?

RewriteEngine on

RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N,DPI]
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=302]

Обратите внимание на DPI. А без этого флага вы подвесите сервер при такой конструкции /cat/3_4_5, если у вас нет директории cat.
Вот именно это я и имел ввиду в предыдущем блоке - работает частично.

Что делать? Как по мне такой код даже более интересен, чем предыдущий

RewriteRule ![A-Z] - [S=26]
RewriteRule (.*)A(.*) $1a$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)B(.*) $1b$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)C(.*) $1c$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)D(.*) $1d$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)E(.*) $1e$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)F(.*) $1f$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)G(.*) $1g$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)H(.*) $1h$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)I(.*) $1i$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)J(.*) $1j$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)K(.*) $1k$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)L(.*) $1l$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)M(.*) $1m$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)N(.*) $1n$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)O(.*) $1o$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)P(.*) $1p$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)Q(.*) $1q$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)R(.*) $1r$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)S(.*) $1s$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)T(.*) $1t$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)U(.*) $1u$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)V(.*) $1v$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)W(.*) $1w$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)X(.*) $1x$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)Y(.*) $1y$2 [N,DPI,E=HASCAPS:yes]
RewriteRule (.*)Z(.*) $1z$2 [N,DPI,E=HASCAPS:yes]
RewriteCond %{ENV:HASCAPS} ^yes$
RewriteRule (.*) /$1 [R=302,L]

Вот еще бред от сеоспециалиста
Удалить пустой вопрос (empty query string)

RewriteCond %{THE_REQUEST} ^[^\s]+\s+[^?]*?\?
RewriteCond %{QUERY_STRING} =""
RewriteRule .? %{REQUEST_URI}? [R=301,L]