1

この問題はしばらくの間私を悩ませてきました。

私は小さなサイトエンジンを作成し、mod_rewriteを使用して、どのページを処理するかをエンジンに指示しています。SEOフレンドリーリンクはボーナスです:)。

これが今日の仕組みです。

住所http://www.example.com/site/pageはhttp://www.example.com/engine.php?address=page になります

しかし、私が欲しいのは、アドレスhttp://www.example.com/pagehttp://www.example.com/engine.php?address=pageになります。

呼び出し用の疑似ディレクトリ(/ site)を作成するとすべて正常に機能しますが、ルートから同じことを実行しようとすると、奇妙なことが起こり始めます。

RewriteBase /
RewriteRule ^site/(.*) engine.php?%{QUERY_STRING}&address=$1

正常に動作します:/ site / about /contactsはeninge.php?address = about/contactsになります

RewriteBase /
RewriteRule ^(.*)$ eninge.php?%{QUERY_STRING}&address=$1

何らかの理由で/about/ contactsがeninge.php?address=eninge.phpになります。

4

3 に答える 3

0

RewriteLogを確認してください(これは2.4で更新されています。2.2を使用していない場合は、現在のドキュメントを確認してください)。

RewriteLog "/usr/local/var/apache/logs/rewrite.log"
RewriteLogLevel 3 

これにより、何が行われているのかが正確に示さmod_rewriteれ、出力に基づいて構成を調整できます。注意してください-それは非常に急速に成長するので、実稼働環境では決して使用しないでください。

余談ですが、投稿にいくつかのタイプミスがあります。これらが設定と異なることを確認する価値があります。

于 2012-04-16T14:04:53.290 に答える
0
RewriteCond %{REQUEST_FILENAME} !^engine.php
RewriteRule (.*) engine.php?address=$1 [QSA,L]

これを試して。あなたが持っているのは、リライトをループさせて、最初engine.php?address=about/contactsは期待どおりに実行しますが、次にもう一度回って、それをにリライトしengine.php?address=engine.phpます。わかる?これ[QSA,L]は、クエリ文字列の追加と最後のフラグであり、クエリ文字列をURLに追加し、リライトエンジンにリライトの検索を停止するように指示します。現在のRewriteCond %{REQUEST_FILENAME} !^engine.phpURLがengine.phpで始まらないことを確認して、エンジンの書き換えをまだ指定していないことを確認します。これは、.httpd構成ファイルではなく.htaccessファイルに書き込む場合に必要です。

于 2012-04-16T14:12:16.173 に答える
0

(.*)何かを捕まえることを意味します。キャッチオールの前にファイルとディレクトリを除外しようとしましたか?それがないと無限再帰が発生するからです。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ eninge.php?%{QUERY_STRING}&address=$1 [L]

詳細については、公式ドキュメントを参照してください:http: //httpd.apache.org/docs/current/mod/mod_rewrite.html

更新:[L]ルールの最後に、ここで書き換えプロセスを終了するようにApacheに指示することも指定する必要があります。

于 2012-04-16T14:12:46.660 に答える