クライアントの既存の Web サイトを置き換えるために、新しい Web サイトを開発しました。彼らの以前のサイトには、自社製品への見栄えの悪い URL がいくつかありました。たとえば、古い URL:
http://mydomain.com/p/-3-0-Some-Ugly-Product-Info-With-1-3pt-/a-arbitrary-folder/-18pt/-1-8pt-/ABC1234
これらの古い URL を使用する新しいサイトへのすべての要求をキャッチしたいと考えています。古い URL から必要な情報ABC1234
は、製品 ID です。明確にするために、古い URL は で始まり、/p/
その後に 4 つのレベルのフォルダーが続き、その後に製品 ID が続きます。
たとえば、上記の URL は次のように書き換える必要があります。
http://mydomain.com/shop/?sku=ABC1234
Linux で Apache 2.2 を使用しています。一致する正しいパターンを教えてもらえますか? これが間違っていることはわかっていますが、現在私がいる場所は次のとおりです。
RewriteRule ^p/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)?$ shop/?sku=$5 [R=301,NC,L]
4 つのフォルダーのそれぞれに一致させるために使用されるパターンは冗長であると確信していますが、正規表現についてはそれほど鋭敏ではありません。オンラインの正規表現エバリュエーターをいくつか試しましたが、成功しませんでした。
ありがとうございました。
--編集#1--
実際、上記の RewriteRule は機能しますが、短縮する方法はありますか?
--編集#2--
ddr のおかげで、この式を次のようにまとめることができました。
RewriteRule ^p/([\w-]+/){4}([\w-]+)$ shop/?_sku=$2 [R=301,NC,L]
--編集 #3--
主に ddr の利益のためですが、支援できる人なら誰でも歓迎します。新しいサイトで動作するように書き換える必要がある 10,000 を超える URL を扱っています。これまでに提供した情報はまだ有効ですが、すべての古い URL が適切に書き換えられていることをテストしているため、ddr が提供する RewriteRule の例では機能しないいくつかの異常に遭遇しています。
上記のように、必要な製品 ID が URL の最後にあるという点で、古い URL は一貫しています。最初のフォルダーは常に/p/
. この時点で私が直面している問題は、一部の URL に URL エンコードされた二重引用符 (") が含まれていることです。さらに、一部の URL には、前述の 4 つのフォルダーの 1 つとして /-/ が含まれています。古い URL のバリエーション:
/p/-letters-numbers-hyphens-88/another-folder/-and-another-/another-18/ABC1234
/p/-letters-numbers-hyphens-88/2%22/-/-/ABCD1234
/p/letters-numbers-hyphens-1234/34-88/-22/-/ABCD1234/
古い URL は厄介ですが、次のことは常に正しいと言っても過言ではありません。
- それぞれ /p/ で始まります
- それぞれが、分離する必要がある製品 ID で終わります。
- /p/ と製品 ID の間には、常に 4 レベルのフォルダーがあります。
- 中間のフォルダにはハイフンがあるものとないものがあります。
- 間にあるいくつかのフォルダーはハイフンのみです。
- 間にある一部のフォルダーには、URL エンコードされた % 文字が含まれています。
- リクエストには、
/
最後に が含まれるものと含まれないものがあります。
次のルールは ddr によって提供され、% パーセント記号またはハイフンのみのフォルダーを含む URL に遭遇するまではうまく機能していました。
RewriteRule ^p/(?:[\w-]+/){4}([\w-]+)$ shop/?_sku=$1 [R=301,NC,L]
上記のルールを考慮して、ハイフンのみ (/-/) のフォルダーまたはパーセント記号を許可するように編集するにはどうすればよいですか?