0

htaccess リダイレクトに関する質問が多すぎることは知っていますが、正確な解決策を見つけることができませんでした。一致する質問があれば申し訳ありません。

私のパブリック html (webroot) フォルダーには、次の htaccess ファイルがありました。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

次に、「www」を含む URL を「非 www」にリダイレクトするために、2 行追加しました。そして、ファイルは次のようになりました:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]

    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

</IfModule>

問題は、 www.example.comはexample.com にリダイレクトされます が、 www.example.com /mycontroller/ はexample.com/mycontroller/にリダイレクトされないことです。

どうすればこれを解決できますか?

4

1 に答える 1

6

最初の RewriteRule は、実際の物理ファイル/フォルダーを持たないすべての URL を index.php ページに書き換えますが、一致する場合は、これを最後のルールとして扱い、それ以降のすべてのルールの処理を停止します ([L]国旗)。そのため、ルート パスだけで呼び出すと、トリガーされずに www 書き換えルールに進みますが、他の論理 URL は最初の書き換えをトリガーして停止します。

ルールの順序を変更し、RewriteCond/RewriteRule ペアをデフォルトのものの前に置くだけです。

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]


</IfModule>

これを仮想ホストとして実行し、Apache の構成ファイルにアクセスできる場合は、ルールを Apache の仮想ホストの conf ファイルに入れて、Cake のバージョンを更新するときに上書きされないようにすることを検討してください。または、変更を保護するようにしてください。

于 2012-06-28T09:24:59.443 に答える