0

私は書き換えルールを持っています:

RewriteRule ^ajax/favourite/([^/]*)$ ajax/favourite/user/index.php?user=$1 [L]

これは正常に機能しますが、このルールは次のとおりです。

RewriteRule ^ajax/favourite/remove/([^/]*)$ ajax/favourite/remove/index.php?user=$1 [L]

リンク内のユーザーとして常に index.php を返します。?user が設定されていることをテストしましたが、URL が ../remove/username の場合でも、?user 情報としてユーザー名が表示されず、「index.php」が表示されます。

1つのディレクトリを除いて同一である前と同じように機能せず、正常に機能する理由がわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

1

私はあなたの書き直しを次のように変更することをお勧めします:

RewriteRule ^/ajax/favourite/([^/]+)$ /ajax/favourite/user/index.php?user=$1 [L]

RewriteRule ^/ajax/favourite/remove/([^/]+)$ /ajax/favourite/remove/index.php?user=$1 [L]

両方でユーザー名として少なくとも1文字が必要であるため、正規表現の前にを追加し/、後方参照内で変更*したことに注意してください。+

また、書き換えルールが期待どおりに機能しない理由がわからない場合は、apache構成で書き換えログを有効にすることもできます。仮想ホストは、これを配置するのに最適な場所である必要があります。

RewriteLogLevel 9
RewriteLog /var/log/http/yourserver.log

リライトログには、リクエスト処理中にapacheが実行したすべての前提条件とアクションが表示されます。書き換えルールの何が問題になっているのかが正確にわかります。

このログは本番環境では無効にする必要があることに注意してください。

また、私の環境であなたのケースを複製しました。これは、書き換えルールが正しく一致したときに表示されると予想されるログです。

(2) init rewrite engine with requested uri /ajax/favourite/remove/provola
(3) applying pattern '^/ajax/favourite/([^/]+)$' to uri '/ajax/favourite/remove/provola'
(3) applying pattern '^/ajax/favourite/remove/([^/]+)$' to uri '/ajax/favourite/remove/provola'
(2) rewrite '/ajax/favourite/remove/provola' -> '/ajax/favourite/remove/index.php?user=provola'
(3) split uri=/ajax/favourite/remove/index.php?user=provola -> uri=/ajax/favourite/remove/index.php, args=user=provola
(2) local path result: /ajax/favourite/remove/index.php
(2) prefixed with document_root to /opt/local/apache2/htdocs/ajax/favourite/remove/index.php
(1) go-ahead with /opt/local/apache2/htdocs/ajax/favourite/remove/index.php [OK]

アップデート

では、なぜあなたの構成がとても奇妙な振る舞いをするのですか(動作しているかどうか)?より多くの情報(すなわち、あなたの暫定的な完全な書き直しログ)なしでは、私は答えを与えることができません。

/最初はそれがわかりませんでした。両方の構成(最初の質問と2番目のコメント)は、各リライターの前にあるのを見逃しているため、機能しません。

この仮説の証拠はリライトログにあり、4行目には一致が成功しています。/その一致は、最初の書き換えパターンなしでは不可能です。この時点以降、残りのすべてのログ行は、一致が成功した場合の動作を示しています。

于 2013-01-25T22:49:06.177 に答える