0

私はこのビットをうまく処理できないので、私はばかでなければなりません。

私はURLを持っています:www.site.com.au/products/product-name.html

これらを次の場所にリダイレクトする必要があります:www.site.com.au/product-name.html

すべてのリンクは動的であり、フォルダーは存在しません。これを実現するためにどのReWriteルールを使用しますか?

これは私がこれまでに得たものです:

RewriteCond %{HTTP_HOST} ^(www|test)\.site\.com\.au
RewriteCond %{REQUEST_URI} ^(/products/)
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule ^.+\.html$ ${lc:%{REQUEST_URI}} [NC,R=301,L]

リモート/productsにビットを追加する必要があります

ありがとう。

4

2 に答える 2

0

OK、正確なフォーマットを理解するのに十分なApacheRewriteについては本当に知りません。しかし、多くの苦労の末、これらはうまくいった結果です:

# Lowercase all /products/
RewriteCond %{HTTP_HOST} ^(www)\.site\.com\.au
RewriteCond %{REQUEST_URI} ^/products/.+\.html
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule ^ ${lc:%{REQUEST_URI}} [R=301,L]

# Lowercase all /products/ and strip products/ subfolder
RewriteCond %{HTTP_HOST} ^(www)\.site2\.com\.au
RewriteCond %{REQUEST_URI} ^/products/.+\.html
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule ^products/(.+\.html)$ /${lc:$1} [R=301,L]

ありがとう、

ドム

于 2013-02-12T04:09:06.447 に答える
0
RewriteRule ^products(/.*)$ http://www.site.com.au$1 [L, R=301]

これは、最初の RewriteCond を除いて、リストしたすべてを置き換えます (ドメインに一致させるためですが、VirtualHost がこれら 2 つのドメインでのみ応答する場合は、その RewriteCond を除外して単純化できます)。

RewriteRules は、Apache が RewriteConds を確認する前に最初に照合されるため、RewriteRule 自体で照合を行うことができれば、作業が大幅に簡素化されます。今後の参考のために、RewriteCond で一致させる必要がある場合は、次のようになります。

RewriteCond %{REQUEST_URI} ^/products(/.*)$
RewriteRule ^.*$ http://www.site.com.au%1 [L, R=301]

%1RewriteCond の括弧内に一致するものと、RewriteRule にあるものに一致するものに注意し$1てください。

編集:あなたのコメントによると、次の変更は小文字を強制する必要があります。私は自分でそれを行う必要はありませんでしたが、この Apache ドキュメントによると、これは RewriteMap による内部関数です。元のコードに基づいて、RewriteMap 定義が既に他の場所にあるようです。そうでない場合は、ここに含めました。

RewriteMap lc int:tolower
RewriteCond %{REQUEST_URI} ^/products(/.*)$ [NC]
RewriteRule ^.*$ http://www.site.com.au${lc:%1} [L, R=301]
于 2013-02-10T03:26:22.133 に答える