1

修正しようとしている Web サイトの SEO 用の重複ページに問題があります。www.example.com/category/c1234 は www.example.com/category/c1234garbage とまったく同じようにロードされます オンラインで読んでコードをテストしてきましたが、これまでのところ、可能性のある正規表現の問題に絞り込みました。次の行があります

# url rewrites
RewriteCond %{REQUEST_URI} ^/index\.cfm/.+ [NC]
RewriteRule ^/index.cfm/(([^/]+)/?([^/]+)?)/?(.*)? /index.cfm/$4?$2=$3 [NS,NC,QSA,N,E=SESDONE:true]  

ルールにRを追加して、そこを通過しているかどうかを確認できるようにしました。通過した後、最後のゴミは消えます。www.example.com/category/c1234garbage にアクセスすると www.example.com/category/c1234 にリダイレクトされるように、誰かがこれを理解し、修正する方法を見つけてくれますか?

私はかなり長い間オンラインで検索してきましたが、解決策が見つからないように見えるので、ここに投稿する時が来たのではないかと考えました. 「Mastering Regular Expressions」を読んでいますが、探している答えを見つけるのに時間がかかる場合があります。あなたが私に与えることができるどんな助けにも感謝します. ありがとうございました。

編集:これは私がRewriteEngine On Rewritebaseの前に持っているものです/

# remove trailing index.cfm
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^index.cfm(\?)?$ / [R=301,L]

# remove trailing slash
RewriteCond %{QUERY_STRING} ^$
RewriteRule (.*)/$ /$1 [R=301,L]

# Remove trailing ?
RewriteCond %{THE_REQUEST} \?\ HTTP [NC] 
RewriteRule ^/?(index\.cfm)? /? [R=301,L]

# SEF URLs
SetEnv SEF_REQUEST false
RewriteRule ^[a-z\d\-]+/[a-z]\d+/? /index.cfm/$0 [NC,PT,QSA,E=SEF_REQUEST:true]
RequestHeader add SEF-Request %{SEF_REQUEST}e
RewriteCond %{HTTP:SEF_REQUES} ^true$ [NC]
RewriteRule . - [L]

編集:htaccessをもう一度読んでいて、理解できないことがわかりましたが、何らかの関係があるかもしれません。ファイルの一番下にあります。

# lowercase the hostname, and set the TLD name to an enviroment variable
RewriteCond ${lowercase:%{SERVER_NAME}|NONE}  ^(.+)$
RewriteCond %1  ^[a-z0-9.-]*?[.]{0,1}([a-z0-9-]*?\.[a-z.]{2,6})$
RewriteRule .? - [E=TLDName:%1]
4

2 に答える 2

1

あなたの説明とコードから、これがここで起こっている変換のように思えます:

www.example.com/category/c1234garbage
↓
www.example.com/index.cfm?category=c1234garbage 

したがって、問題は書き換え規則ではないと思います。問題は、サーバー側でクエリ文字列パラメーターを処理する方法です。これらのパラメーターを解釈しているという実際のページがある場合は、index.cfmそのページの背後にあるコードを微調整して、それらを検証し/category/c1234、適切な場所にリダイレクトする必要があります。

のコードはパラメーターを見て、それが認識可能なもので始まるindex.cfmかどうかを確認し、そこから進んでいると思います。もっと厳しくする必要があります。

または、別の .htaccess ルールを追加してc1234garbageパーツを解析し、どのパーツが有効で、どのパーツ (存在する場合) がガベージであるかを判断することもできます。ただし、アプリケーションでの有効な入力のルールがわからないため、その正規表現を提供することはできません。


編集:

私は問題を見つけたと思います。ここのこの部分:

RewriteRule ^[a-z\d\-]+/[a-z]\d+/? /index.cfm/$0 [NC,PT,QSA,E=SEF_REQUEST:true]

で相対 URL の先頭を^指定しますが、最後まで一致させることは指定しません。したがって、一致する文字列の一部を取り、他のすべてを捨てて、に追加していると思います/index.cfm/。したがって、/category/c1234からの部分のみを取得します。/category/c1234garbageこれは、 に一致する部分だから^[a-z\d\-]+/[a-z]\d+/?です。

おそらくこれは、単語の区切りだけで修正できます。

RewriteRule ^[a-z\d\-]+/[a-z]\d+\b/? /index.cfm/$0 [NC,PT,QSA,E=SEF_REQUEST:true]

それでもうまくいかない場合は、htaccess に関する私の知識が限界に達していると思います。私は正規表現の男です。

ところで、これはまだ少しぎこちないようです。私がこの権利を理解していれば、URL の一部があなたの正確なパターンに適合しない場合でも破棄されます。たとえば/category/c1234?abc=123、クエリ文字列パラメーターが失われます。ルールの設定方法を再設計することをお勧めします。

于 2013-01-07T18:17:50.090 に答える
0

問題を部分的に解決しました。追加した

# Remove garbage from after category
RewriteCond %{REQUEST_URI} [a-z\d\-]+/[a-z]\d+(.+)
RewriteRule ^([a-z\d\-]+/[a-z]\d+)/? $1 [R=301]

SEF ルールの上に。URLからガベージを削除することは私が望んでいることですが、URLがクリーンな場合でもリダイレクトされるため、無限ループが発生します。ヒントはありますか?

編集:だから、最後の .+ も数字と一致していることに気付きました...数字の後の数字以外のものと一致するように変更するにはどうすればよいですか? 基本的に .+ がある場所には、「数字以外の任意の文字に一致する」必要があります

編集:最終的に次のコードで動作するようになりました:

# Remove garbage from after category
RewriteCond %{REQUEST_URI} [a-z\d\-]+/[a-z]\d+[A-Za-z-.]+
RewriteRule ^([a-z\d\-]+/[a-z]\d+)/? $1 [R=301]

以前使用していた (.+) は、2 番目の数字 (c1234) を の一部として読み取っていました。そのため、c1 のようなものでない限り、常に条件を true として渡します。

于 2013-01-07T22:18:18.460 に答える