1

これは非常に奇妙な問題です。明確に説明できることを願っています。

基本的に、今日、クライアント サイトでメジャー アップデートを行い、新しい構造に対応するために htaccess のいくつかの書き換えルールを更新する必要がありました...

つまり、もともと次のようなものを持っていた場所:

RewriteRule ^/resources/?$  index.php?id=resources
RewriteRule ^/media/?$      media.php

次のように変更しました。

RewriteRule ^/resources/?$  index.php?id=resources
RewriteRule ^/media/?$      index.php?id=media

しかし、http://www.example.com/mediaにアクセスすると、古いメディア ページが表示されていました。次に、古い media.php をドキュメント ルートから削除すると、404 が発生しました。どこかがまだ /media を media.php にマッピングしており、書き換えルールを無視しています。

奇妙なことに、ファイル内の他のすべての書き換えルールは正常に機能しており、そこには約 20 個ほどあります。

vhost やその他の構成ファイルを追跡しましたが、メディアへの参照やその他の破損したリダイレクト (合計 3 つ) が見つからないため、困惑しています。

4

2 に答える 2

2

これは、AcceptPathInfoが原因であると強く疑っています。これは、私の見解では、Apacheの誤った機能です。デフォルトでは、PHPがハンドラーである場合にオンになっていると思います。

.htaccess、できればhttpd.confに追加してみてください(そして再起動してください)。

AcceptPathInfo Off

参照: http: //httpd.apache.org/docs/2.2/mod/core.html#acceptpathinfo

-

いくつかのサイドポイント:

一致するものが見つかった場合は、RewriteRulesが常に[L]で終わるようにする必要があります。これはデバッグに役立ちます。例えば:

RewriteRule ^/media/?$      index.php?id=media [L]

また、同様のルールを組み合わせることで、ルールの数を減らすことができます。例えば:

RewriteRule ^/(media|resources)/?$  index.php?id=$1 [L]

個人的には/の使用だと思いますか?前半の終わりには、両方のURLがリダイレクトなしで機能することを意味するため、適切ではありません。つまり、「正しい」決定的なURLがないことを意味します。個人的に私は使用します:

RewriteRule ^/(media|resources)/$  index.php?id=$1 [L]
RewriteRule ^/(media|resources)$ /$1/ [L,R]

つまり、一意のリソースには、単一の正規の(決定的な)URLが必要です。

于 2009-10-28T19:50:07.960 に答える
2

サイト .htaccess で MultiViews オプションを無効にすると、問題が修正されました。これにより、書き換えルールの前に処理されていたコンテンツ ネゴシエーションが有効になっているように見えました。

于 2009-11-03T22:11:39.557 に答える