この構造のカテゴリページがあります
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]
どうすればいいですか?
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を使用していると思いますか? (おそらくこれはあなたの.htaccess
にsomethingを追加したと思いますか?)
とにかく、最初の質問に対処するには...
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構造を実装するには、新しい「きれいな」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
は、RewriteRule
patternでキャプチャされたグループへの後方参照です。すなわち。それぞれ\d+
および[\w-]+
。
これが新しいサイトの場合は、そこで停止できますが...
このリダイレクトは、.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
サーバー変数(RewriteRule
patternに対してチェックする必要がありますURLのURLパス部分とのみ一致します)。
%1
および%2
は、最後に一致したCondPatternでキャプチャされたグループへの後方参照です。すなわち。それぞれ\d+
および[\w-]+
。これは、以前の書き換えの逆です。
リクエストからクエリ文字列を削除するには、RewriteRule
substitutionの末尾の?
が必要です。 (または、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を無効にする必要があります(まだ有効になっていない場合)。