web-dev-qa-db-ja.com

スラッシュ(/)の後のすべてを別のディレクトリにリダイレクトする

これは簡単なことだと思いますが、答えが見つからないようです!

https://carddav.example.com/MYUSERNAMEhttps://carddav.example.com/remote.php/subdomain/addressbooks/MYUSERNAME/contactsにリダイレクトしようとしていますが、MYUSERNAMEは何でもかまいません。

私が試みた現在のRewriteRuleは次のようになります。

RewriteRule ^/(.*)$ https://carddav.example.com/remote.php/carddav/addressbooks/$1/contacts/ [R=301]
2
aidanharris

単一の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を確実に分割しますか?)、次のようなパターンを使用できます。

  • ^([^/]+)$
2
MrWhite

多くの忍耐力の問題によって解決された問題。ある時点で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です。

1
aidanharris