Apache で rewriteule が無視された 404 の原因を見つける方法

Apache で rewriteule が無視された 404 の原因を見つける方法

だから私はこれを持っています

RewriteCond %{REQUEST_URI} (da-dk)/(.*)(/|\.php)$
RewriteRule ^(da-dk)/(.*)(/|\.php)$ /$2$3 [L]

しかし、何らかの理由で、example.com/da-dk/ は「404 - 見つかりません」と表示されます。

私はApacheがなぜその結論に達したのか、つまりどのようなルールに遭遇し、それに従ったのかを理解したい。

答え1

これがルート.htaccessファイルにあると仮定すると...

RewriteRule ^(da-dk)/(.*)(/|\.php)$ /$2$3 [L]

/da-dk/(URL パスに一致する)のリクエストはda-dk/正規表現と一致しない^(da-dk)/(.*)(/|\.php)$ため、このルールは処理/遵守されません。

したがって、このリクエストに一致する他のルールがない限り、いいえルールが守られているので、404が表示されます。(どのルールに「遭遇」するかについては、他のすべてのルールは遭遇した

ちなみに、前述の状態RewriteCondディレクティブ)はここでは完全に不必要であり、削除する必要があります。RewriteRule パターンすでに確立されています。

具体的には、このルール (正規表現) は次の形式の URL に一致します。

  • /da-dk/.php
  • /da-dk/<foo>/
  • /da-dk/<foo>.php
  • /da-dk/<foo>/<bar>/<baz>/
  • /da-dk/<foo>/<bar>/<baz>.php

一致しません:

  • /da-dk/<foo>
  • /da-dk/

このルールは、/da-dk要求されたURLのプレフィックス(おそらく希望書き換えられた URL がファイルシステムのディレクトリまたはファイルと一致することを確認します。

ルートに書き戻す必要がある場合は/da-dk/、上記のルールを変更してこれを可能にします (その過程で、少し簡略化することもできます)。たとえば、代わりに次のコードを試してください。

RewriteRule ^da-dk/(.+(/|\.php))?$ /$1 [L]

ここで、URLパスの後の部分da-dk/オプション(この場合、$1バックリファレンスは実質的に空の

量指定子を から に変更することで、*(+無意味な) URL との一致も回避されます/da-dk/.php

する必要がない捕獲部分da-dk(最初のパスセグメント)は、代替文字列(2番目の引数)。

バック$1リファレンスには、プレフィックスの後の URL パス全体が含まれるようになりました。(元のようにand はda-dk/必要ありません。)$2$3

関連情報