私の目標は、これらのパスからユーザーをリダイレクトすることです。
/foo/index.php
/foo/
に
/index
そして/index
、から元のコンテンツをロードしました/foo/index.php
。
これはで可能.htaccess
ですか?
これまでに試しました:
RewriteRule ^foo/(index\.php)?$ /index [R=301,QSA,L]
RewriteRule ^index$ /foo/index.php [QSA,L]
しかし、これは無限のリダイレクトループに入ります。RewriteCond
URIにを追加すると役立つと思いましたが、ドキュメントから:
注:条件は、のパターン
RewriteRule
が一致した後に処理されます。
したがってRewriteCond
、私のユースケースではあまり役に立たないようです。
Rewrite Flagsのドキュメントを見ると、S
フラグは私が探しているもののようです。
このフラグは、現在のルールが一致する場合、書き換えエンジンに次のnumルールを順番にスキップするように強制します。これを使用して、疑似if-then-else構文を作成します。then-clauseの最後のルールはskip = Nになります。ここで、Nはelse-clauseのルールの数です。
だから私は試しました:
RewriteRule ^index$ /foo/index.php [QSA,L,S=1]
RewriteRule ^foo/(index\.php)?$ /index [R=301,QSA,L]
しかし、私はL
旗を持っているので、S
旗は少し冗長に見えます。それにもかかわらず、これはまだ無限のリダイレクトループにありますが、私の見解ではロジックは正しいようです。
現在、PHPで回避策を使用しています。まず、Apacheは内部で新しいURLを古いURLに書き換え、次にPHP$_SERVER['REQUEST_URI']
で、スクリプトの最初にある新しい形式と一致するかどうかを確認します。一致しない場合は、新しいURLへの301リダイレクトを実行します。
でも、これだけでできるのか知りたいのですが.htaccess
?または、上記の書き換えルールで無限ループが発生する方法/理由を誰かが説明できれば、感謝します。