web-dev-qa-db-ja.com

パラメータを含むURLから.htaccessのSEOフレンドリーURLにリダイレクトする

この構造のカテゴリページがあります

example.com/Category.php?Category_Id=10&Category_Title=some-text

リダイレクトするhtaccessルールを書きたい

example.com/Category.php?Category_Id=10&Category_Title=some-text

これに

example.com/Category/10/some-text

htaccessに強制する方法はありますか。私が訪れたときに欲しい

example.com/Category.php?Category_Id=10&Category_Title=some-text

カテゴリページは自動的にリダイレクトします

example.com/Category/10/some-text

私はこのhtaccessコードを使用しますが、ページをseoフレンドリーなURLにリダイレクトしません

Options -Multiviews
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_Host} !^exmaple\.com$
RewriteRule ^(.*) http://exmaple.com/$1 [R=301,L]

どうすればいいですか?

5
Mohammadreza

tl; dr

# Redirect /Category.php?Category_Id=10&Category_Title=some-text
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^Category_Id=(\d+)&Category_Title=([\w-]+)$
RewriteRule ^Category\.php$ /Category/%1/%2? [R=301,L]

生成されたリンクを不良なseo構造からseoに優しい構造に変更しました。

あなたはそれを整理してくれてうれしいです、あなたは何らかのCMSを使用していると思いますか? (おそらくこれはあなたの.htaccesssomethingを追加したと思いますか?)

とにかく、最初の質問に対処するには...

Me:アプリケーションのURLを「きれいな」形式に変更しましたか?例えば。ユーザーがページに表示するURLは、example.com/Category/10/some-textではなくexample.com/Category.php?Category_Id=10&Category_Title=some-‌text?です。

You: yes。しかし、それはたくさんあります。すべてのページですべてのURLをきれいにする必要があり、今これをやっています。しかし、htaccessソリューションがあるかどうか知りたいです.soあなたはすべてのページでURLを変更することが唯一の解決策だと言います...

アプリケーションのURLを実際に変更することなく、これを.htaccessのみで実装することは技術的には可能ですが、お勧めしません。ユーザーエクスペリエンスが低下し、サイトのSEOに損害を与える可能性があります。

アプリケーションのURLを変更しなかった場合、ユーザーが内部リンクをクリックするたびに、正規URLへの外部リダイレクト(2番目の要求)が発生します(リダイレクトがキャッシュされるまで)。これは、サーバー上の余分な(不要な)要求です。古いURLはユーザーに公開され、コピー可能になります(「リンクアドレスのコピー」など)。

通常、このようなリダイレクトを実装する唯一の理由は、古いURLが既にリンクされているか、検索エンジンが古いURL構造に既にインデックスを付けている場合です。 SEOを保持するには、リダイレクトが必要です。

内部書き換え(新しい「きれいな」URLから古い「ugい」URLへ)

このようなユーザーフレンドリーなURL構造を実装するには、新しい「きれいな」URLからのリクエストを静かに書き換えるinternal rewriteが必要です。古い「ugい」(実際の)URLへ。ユーザーには、新しい「きれいな」URLのみが表示されます。あなたの質問から、あなたはすでにこのようなものを持っていると思われます(そうでないかもしれません)?例えば:

# Rewrite /Category/10/some-text
RewriteRule ^Category/(\d+)/([\w-]+)$ Category.php?Category_Id=$1&Category_Title=$2 [L]

$1および$2は、RewriteRulepatternでキャプチャされたグループへの後方参照です。すなわち。それぞれ\d+および[\w-]+

これが新しいサイトの場合は、そこで停止できますが...

外部リダイレクト(古い「ugい」URLから新しい「きれいな」URLへ)-optional

このリダイレクトは、.htaccessファイルで上記の書き換えを行う前に実行する必要があります。

# Redirect /Category.php?Category_Id=10&Category_Title=some-text
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^Category_Id=(\d+)&Category_Title=([\w-]+)$
RewriteRule ^Category\.php$ /Category/%1/%2? [R=301,L]

URLのクエリ文字列部分を確認するには、RewriteCondディレクティブを使用し、QUERY_STRINGサーバー変数(RewriteRulepatternに対してチェックする必要がありますURLのURLパス部分とのみ一致します)。

%1および%2は、最後に一致したCondPatternでキャプチャされたグループへの後方参照です。すなわち。それぞれ\d+および[\w-]+。これは、以前の書き換えの逆です。

リクエストからクエリ文字列を削除するには、RewriteRulesubstitutionの末尾の?が必要です。 (または、Apache 2.4+でQSDフラグを使用できます)

PDATE:REDIRECT_STATUS環境変数に対してチェックするconditionは、初期リクエストのみをリダイレクトし、後のディレクティブによる書き換えられたリクエスト(上記を参照)。 REDIRECT_STATUS env varは最初のリクエストには存在せず(つまり空です)、最初の内部書き換え/サブリクエストの後にのみ設定されます。 (.htaccessなどのディレクトリごとのコンテキストでは、書き換えプロセスは本質的に最後のRewriteRuleの後からやり直し、URLが変更されずに通過するまで継続します。Lフラグは単に「現在のパススルー」を引き起こします書き換えプロセスが終了し、現在書き換えられたURLを入力として使用して、プロセスを効果的に再開するようにトリガーします。

概要

これをまとめると、次のようになります。

Options -Multiviews
RewriteEngine On

# Canonical www to non-www redirect
RewriteCond %{HTTP_Host} !^example\.com
RewriteRule (.*) http://exmaple.com/$1 [R=301,L]

# Redirect /Category.php?Category_Id=10&Category_Title=some-text
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^Category_Id=(\d+)&Category_Title=([\w-]+)$
RewriteRule ^Category\.php$ /Category/%1/%2? [R=301,L]

# Rewrite /Category/10/some-text
RewriteRule ^Category/(\d+)/([\w-]+)$ Category.php?Category_Id=$1&Category_Title=$2 [L]

この特定の例を動作させるには、MultiViewを無効にする必要があります(まだ有効になっていない場合)。

4
MrWhite