0

/<module>/<controller>/<action>/ で MVC を使用していますが、example.com/module/whatever にモジュールがあり、example.com/module-a/whatever に「名前を変更」する必要があります。アプリケーション全体が既に作成されているため、コード内のすべての場所を調べて変更することはできません。そのため、mod_rewrite でそれを実行したいと考えています。私は次のことを試しました

RewriteCond %{THE_REQUEST} ^GET\ /module/
RewriteRule ^module/(.*) /module-a/$1 [L,R=301]

これは、example.com/module/whatever のようなすべての URL を example.com/module-a/whatever にリダイレクトする限り、私が望んでいたことを行いましたが、「module-a」でのすべてのリクエストを内部的に「module」として書き換える必要があります。 . また、モジュール ルート (つまり、末尾にスラッシュがない example.com/module) に対しても機能する必要があります。これは可能ですか?追加した

RewriteRule ^module-a/(.*)$ module/$1

上記の条件とルールのすぐ下にありますが、ページにアクセスすると、モジュール 'module-a' が見つからないというメッセージが表示されます。


編集:

それらの下にさらにいくつかのルールがあります。それらがこれに影響を与えるとは思いませんが、とにかくここにあります:

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L] 

解決

結局使ってしまった

RewriteCond %{THE_REQUEST} ^GET\ /module/
RewriteRule ^module$ /module-a [L,R=301]
RewriteRule ^module/(.*) /module-a/$1 [L,R=301]

すべてのリンクを module から module-a にリダイレクトします。URL example.com/module.

内部的に書き直すと、元のルールが正常に機能しますが、Zend はそれをオーバーライドするようなことを行うようで、ルートで処理する必要がありました。ルートを使用して zend モジュールの名前を変更するを参照してください

4

1 に答える 1

0

私の理解が正しければ、あなたはこれについて間違った方向から進んでいます。RewriteCond の目的についても明確ではありません

すべての module-a/* リクエストを内部で module/* として処理する必要があるため、必要なのは単純な書き直しだけです::

RewriteRule ^module-a/?(.*) /module/$1 [L]

あなたが抱えている問題は、サイトの内部リンクがすべて/module-a/ではなく/module/を参照していることだと思いますが、そこに301を配置すると、問題の終わりはありません(特に検索エンジンでは)。書き換えると、循環参照に陥る可能性があります。アプリのリンク コードを変更するか (リンク抽象化クラスがある場合)、最悪の場合、ページをレンダリングする前に出力バッファリングを使用してすべてのリンクを交換する方がはるかに優れています。

注: 上記の下の 2 番目のルールは、最初のルールが一致した場合は処理されません。[L] は、そのルールが一致した場合に mod_rewrite の処理を​​停止させるためです。

于 2012-05-18T18:41:58.497 に答える