2011-01-31 14 views
7

Mam witrynę z zestawem starych stron .html i .php, które zostały umieszczone w CMS.Używanie mod_rewrite i mod_alias (przekierowanie 301) razem w. Htaccess?

Obecnie w pliku .htaccess istnieje około 30 mod_alias przekierowań w następującej formie:

redirect 301 /oldpage1.html http://www.example.com/newpage1.php 
redirect 301 /oldpage2.php http://www.example.com/newpage2.php 
redirect 301 /oldpage3.php http://www.example.com/newpage3.php 

Ale chcemy użyć mod_rewrite mieć ładne adresy URL w naszym CMS, które będzie miało formę http://www.example.com/pagename.php, więc również posiadać:

RewriteEngine on 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)$ index.php?page=$1 

Obecnie oba są stosowane razem, co powoduje:

http://www.example.com/newpage1.php?page=oldpage1.html 

Jak mogę zastosować regułę przepisywania tylko wtedy, gdy nie pasuje poczynione przez mod_alias przekierowanie 301 wypowiedzi, tak że pojawia się, co następuje:

http://www.example.com/oldpage1.html -> przekierowuje do -> http://www.example.com/newpage1.php -> który jest traktowany jako - > http://www.example.com/index.php?page=/newpage1.php

Jakieś wskazówki byłyby bardzo doceniane? Dzięki.

Odpowiedz

10

Znalazłem odpowiedź w great explanation of mod_rewrite and mod_alias

Problemem jest to, że mod_rewrite zawsze występuje przed mod_alias, niezależnie od kolejności umieszczane są w pliku .htaccess. Jest to odwrotność kolejności wymaganej w tej sytuacji.

Sztuką jest użycie RewriteRule [R=301] zamiast redirect 301, a więc użycie mod_rewrite dla wszystkiego zamiast mieszania go z mod_alias.

Pełne rozwiązanie jest następujące:

RewriteEngine on 
RewriteBase/

RewriteRule ^oldpage1.html /newpage1.php [R=301,L] 
RewriteRule ^oldpage2.php /newpage2.php [R=301,L] 
RewriteRule ^oldpage3.php /newpage3.php [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)$ index.php?page=$1 
Powiązane problemy