1

私の目標は、これらのパスからユーザーをリダイレクトすることです。

/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]

しかし、これは無限のリダイレクトループに入ります。RewriteCondURIにを追加すると役立つと思いましたが、ドキュメントから:

注:条件は、のパターン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?または、上記の書き換えルールで無限ループが発生する方法/理由を誰かが説明できれば、感謝します。

4

1 に答える 1

1

問題は、ルールが.htaccessファイル内にあることです。ドキュメント.htaccessにあるように、このファイルは、別のディレクトリのに適用可能である可能性があるため、すべてのrewiteループの後に再解析されます。したがって、あなたのL旗はすべて無駄です。

私は周りを見回しましたが、実際にリライトルールをメインのApache構成に配置できない場合は、次のような判断を下すことができます。THE_REQUESTリライトの実行間でサーバー変数が更新されないため、そこにあり、その場合の書き換えを防ぎます。

# external redirect to /index (unless browser already shows /index plus query params)
RewriteCond %{THE_REQUEST} !^\w+\ /index(\?.*)?\ HTTP/1..$
RewriteRule ^foo/(index\.php)?$ /index [R=301,QSA,L]

# internal redirect for /index
RewriteRule ^index$ /foo/index.php [QSA,L]

変更されていない別の変数もあると思いましたが、今は見つかりません。多分誰か他の人?

于 2013-02-12T22:57:46.440 に答える