1

これは .htaccess ファイルにあります

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

私がやろうとしているのは、この構成に別の RewriteRule を追加して、これらのような古い URL がサイトのルートにリダイレクトされるようにすることです。

http://www.acme.com/category.php?id=6
http://www.acme.com/product.php?id=183&category= 

「category.php」と「product.php」が無効な文字列になることはわかっています。例として「category.php」を使用して、構成を次のように変更してみました

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^category.php(.*) / [L,R=301]
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

これにより、次のようにリダイレクトされます

http://www.acme.com/category.php?id=112 -> http://www.acme.com/?id=112

2つの問題があります

  1. クエリ文字列を追加したくありません。[QSA] を指定していません
  2. ルートを直接入力すると、www.acme.com追加したばかりの行を削除しない限り、ページは表示されません。新しい RewriteRule が「category.php」で始まらない URL に影響するのはなぜですか?

[編集]

上記のリダイレクトの代わりにこれも試しましたが、まだ両方のルールが適用されているようです

RewriteRule ^category.php /holdingPage.php [L]
4

1 に答える 1

1

すべてを送信する古いルールに2つの条件を関連付ける必要があり、それらの上index.phpに新しいルールを追加する必要があります。

RewriteEngine On
RewriteBase /

RewriteRule ^category.php /? [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

1.を処理するために、ルールのターゲットの/の最後に「 」を追加しました。これにより、特にQSAフラグがない限り、クエリ文字列が自動的に追加されなくなります。2.については、なぜうまくいかなかったのかわかりませんが、間違ったルールに適用されていた2つの条件と関係がある可能性があります。


編集:

2RewriteCond行の説明については、次の投稿を参照してください:https ://stackoverflow.com/a/11275339/851273

ARewriteCondは本質的に条件付きで、このブロックは次のとおりです。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

本質的にこれです(擬似コードで):

if(request_uri != maps_to_existing file) {
    if(request_uri != maps_to_existing_directory) {
        request_uri = request_uri.replace("([^?]*)", "index.php?_route_=$1", "[L,QSA]");
    }
}

重要なのは、、RewriteCondまたはそれらの多くが次々に適用されるのは、直後にのみ適用されるためRewriteRule、category.phpルールを前に移動しなければ、pseudocdeoに相当するものは次のようになります。

if(request_uri != maps_to_existing file) {
    if(request_uri != maps_to_existing_directory) {
        request_uri = request_uri.replace("^category.php", "/?", "[L,R=301]");
    }
}
request_uri = request_uri.replace("([^?]*)", "index.php?_route_=$1", "[L,QSA]");

if()2つの条件が誤って適用されているため、これはちょっと壊れています。具体的には、「index.php」のようなものに書き換える場合は、ループを防ぐために条件が必要です。

于 2012-07-16T17:10:39.423 に答える