Опираясь на ответ @ anhubhava, он близок, но он также будет соответствовать%, 2 или 0 в URL, и это может вызвать цикл в apache 2.2, если вы не используете параметр DPI. Полный скрипт должен выглядеть так:
Options FollowSymlinks MultiViews
RewriteEngine on
RewriteBase /
# keep replacing space to hyphen until there is no space use internal rewrite
RewriteRule ^([^\s%20]*)(?:\s|%20)+(.*)$ $1-$2 [N,E=NOSPACE:1,DPI]
# when there is no space make an external redirection
RewriteCond %{ENV:NOSPACE} =1
RewriteRule ^([^\s%20]+)$ $1 [R=301,L]
Я также добавил параметр N (Next), так как это вынуждает правила переоцениваться с самого начала сразу после этого правила, если оно совпадает. Если этого нет, вы можете столкнуться с проблемами, если будете использовать apache в качестве обратного прокси-сервера, поскольку маловероятно, что он дойдет до конца переписывания, прежде чем что-то еще произойдет.