
だから私はこれを持っています
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