Проблема в том, что предыдущее правило переписывается в index.php. В этом блоке здесь:
#request to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
### This rule rewrites "for_homes" to "index.php?/for_homes"
RewriteRule ^(.*)$ index.php?/$1 [L]
### These rules never get applied
RewriteRule ^for_homes(.*)$ for_home$1 [L,R=301]
RewriteRule ^for_business(.*)$ for_businesses$1 [L,R=301]
Так что, возможно, после RewriteCond %{REQUEST_FILENAME} !-d
, добавьте условия, чтобы исключить последующие 2 переписывания, чтобы это выглядело так:
#request to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/for_home(s)?
RewriteCond %{REQUEST_URI} !^/for_business(es)?
RewriteRule ^(.*)$ index.php?/$1 [L]
RewriteRule ^for_homes(.*)$ for_home$1 [L,R=301]
RewriteRule ^for_business(.*)$ for_businesses$1 [L,R=301]
Если вы намерены использовать index.php handle for_home
и for_businesses
, чтобы, когда кто-то вводит http://domain.com/for_homes/stuff в адресную строку своего браузера, браузер перенаправляется на http://domain.com/for_home/stuff, затем он внутренне переписывается в /index.php?/for_home/stuff
, так что index.php может обработать запрос, вам просто нужно переместить 301 перенаправления до перезаписи index.php :
### Redirect first
RewriteRule ^for_homes(.*)$ for_home$1 [L,R=301]
RewriteRule ^for_business(.*)$ for_businesses$1 [L,R=301]
#request to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]