質問

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

基本的に、今日クライアントサイトでメジャーアップデートを行い、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つ)への参照を見つけることができません-困惑しています。

役に立ちましたか?

解決 2

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

他のヒント

これは、AcceptPathInfoによるものであると強く考えています。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が必要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top