8

CMSに配置された古い.htmlページと.phpページのセットを含むサイトがあります。

現在、.htaccessファイルには、次の形式で約30のmod_aliasリダイレクトがあります。

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

ただし、mod_rewriteを使用してCMSにきれいなURLを設定したいhttp://www.example.com/pagename.phpので、次の形式も使用します。

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

現在、両方が一緒に適用されているため、次のようになります。

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

mod_aliasリダイレクト301ステートメントによって一致が行われなかった場合にのみ書き換えルールを適用して、次のようにするにはどうすればよいですか。

http://www.example.com/oldpage1.htmlhttp://www.example.com/newpage1.php-> ->として扱われる->->に リダイレクトし ます->http://www.example.com/index.php?page=/newpage1.php

何かヒントをいただければ幸いです。ありがとう。

4

1 に答える 1

12

mod_rewriteとmod_aliasのすばらしい説明で答えを見つけました

問題は、.htaccessでの順序に関係なく、mod_rewriteが常にmod_aliasの前に発生することです。これは、この状況に必要な順序の逆です。

秘訣は、RewriteRule [R=301]の代わりに使用するredirect 301ことです。したがって、mod_aliasと混合するのではなく、すべてにmod_rewriteを使用します。

完全な解決策は次のとおりです。

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
于 2011-02-01T17:59:24.437 に答える