これは簡単なことだと思いますが、答えが見つからないようです!
https://carddav.example.com/MYUSERNAME
をhttps://carddav.example.com/remote.php/subdomain/addressbooks/MYUSERNAME/contacts
にリダイレクトしようとしていますが、MYUSERNAMEは何でもかまいません。
私が試みた現在のRewriteRuleは次のようになります。
RewriteRule ^/(.*)$ https://carddav.example.com/remote.php/carddav/addressbooks/$1/contacts/ [R=301]
単一のRewriteRule
でこれを行うことができます。ここでのコツは、有効なユーザー名文字のみをチェックすることですeverything(つまり、.*
-あなたのユーザー名が文字通りanything?になるとは思わなかったでしょう)。また、すべてのリクエストが一致して処理されるわけではないため、これはより効率的です。
たとえば、ユーザー名は大文字と小文字と数字のみで構成できると仮定すると、次のようになります。
RewriteRule ^([a-zA-Z0-9])$ /remote.php/carddav/addressbooks/$1/contacts [R=301]
これは最初の試行と非常によく似ています。ディレクトリごとの.htaccessファイルのRewriteRule
パターンはスラッシュで始まっていないことに注意してください。ただし、このルールがサーバー構成で使用されている場合は、スラッシュで始まります。
また、「/ remote.php/carddav ...」が有効なユーザー名として一致しないため、書き換えループも当然回避されます(具体的には.
および/
は一致しません)。
また、ユーザー名の長さを制限して、4〜20文字にすることもできます。
^([a-zA-Z0-9]{4,20})$
。スラッシュ以外の文字に一致する必要がある場合(スラッシュはリンク先URLを確実に分割しますか?)、次のようなパターンを使用できます。
^([^/]+)$
多くの忍耐力の問題によって解決された問題。ある時点でmod_rewriteのすべてを学ぶのに時間をかけるべきです。
要するに、次の条件でリダイレクトループを解決しました。
RewriteCond %{REQUEST_URI} !^/remote.php/
上記の条件は基本的にremote.php/ANYTHING_HERE以外のすべてに一致します
次に、上記のRewriteRuleを使用しました
RewriteRule ^(.*)$ /remote.php/carddav/addressbooks%{REQUEST_URI}/contacts [R=301]
RewriteRuleは以前のコメントとほとんど同じですが、実際のリクエスト(私の場合はユーザー名であり、スラッシュを含む-/-がアドレス帳の最後にある必要はありません)を使用する点が異なります。
最終結果は、完全なパーマネントリダイレクトと、carddavにアクセスするときに使用する便利な短いURLです。