.htaccess перенаправить проблему - PullRequest
0 голосов
/ 18 ноября 2011

У меня проблемы с (что должно быть) простым перенаправлением .htaccess. Мне нужно изменить любой URL с "for_homes" на "for_home".

RewriteRule ^for_homes(.*)$ for_home$1 [L,R=301]

Однако, когда я перехожу на любую страницу с for_homes, я получаю 404.


Правила переписывания:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase / 
    RewriteCond %{REQUEST_URI} ^system.* 
    RewriteRule ^(.*)$ /index.php?/$1 [L] 
    RewriteCond %{REQUEST_URI} ^application.* 
    RewriteRule ^(.*)$ /index.php?/$1 [L] 

    #request to index.php 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ index.php?/$1 [L] 
    RewriteRule ^for_homes(.*)$ for_home$1 [L,R=301] 
    RewriteRule ^for_business(.*)$ for_businesses$1 [L,R=301] 
</IfModule> 

Ответы [ 2 ]

0 голосов
/ 19 ноября 2011

Проблема в том, что предыдущее правило переписывается в 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] 
0 голосов
/ 19 ноября 2011

Возможно, вы просто пропали без вести RewriteEngine On

RewriteEngine On
RewriteRule ^for_homes(.*)$ for_home$1 [L,R=301]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...