htaccessの書き換えがすべてのルールで機能しない
-
06-07-2019 - |
質問
これは非常に奇妙な問題であり、明確に説明できることを願っています。
基本的に、今日クライアントサイトでメジャーアップデートを行い、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が必要です。