私は最近、パラメータ付きのURLを次の。htaccessでより読みやすいURLに変更しました:
RewriteRule ^page/([A-Za-z0-9-+_\s]+)$ /index.php?n=$1 [L]
RewriteRule ^category/([A-Za-z0-9-+_\s]+)/([0-9]+)$ /index.php?p=$1&b=$2 [L]
index.php
URLとdomain.com/page/
URLの両方にインデックスが作成されるため、検索エンジンでコンテンツが重複する場合、これにより問題が発生すると考えられます。
domain.com/page/1
への呼び出しがindex.php?n=1
にリダイレクトされる場合、index.php
への要求をdomain.com/page/
にリダイレクトするにはどうすればよいですか?
そうするための私の試みは、ドメイン2に送信する404コードを提供することです。
#RewriteCond %{QUERY_STRING} ^n=([A-Za-z0-9]+)$ [NC]
#RewriteRule ^index\.php$ http://domain.com/page/? [R=301,L]
。htaccess:
IndexIgnore *
ErrorDocument 404 http://domain2.com
#REDIRECTS
Redirect 301 /keyword.php http://domain.com
Redirect 301 /inc/keyword.php http://domain.com
Options +FollowSymlinks
RewriteEngine on
#Redirect all pages in a folder to a single URL
RewriteRule ^test/(.*)$ http://domain.com [L,R=301]
# HTTP Host, escape . and start string with ^
RewriteCond %{HTTP_Host} ^www\.domain\.com [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,NC]
RewriteCond %{QUERY_STRING} ^p=h&m=([A-Za-z]+)&y=([0-9]+)$ [NC]
RewriteRule ^index\.php$ http://domain.com? [R=301,L]
#RewriteCond %{QUERY_STRING} ^n=([A-Za-z0-9]+)$ [NC]
#RewriteRule ^index\.php$ http://domain.com/page/? [R=301,L]
RewriteRule ^page/([A-Za-z0-9-+_\s]+)$ /index.php?n=$1 [L]
RewriteRule ^category/([A-Za-z0-9-+_\s]+)/([0-9]+)$ /index.php?p=$1&b=$2 [L]
URL構造を変更していて、古いURLがすでに索引付けされている場合、コンテンツの重複について考える権利があります。
# My attempt to do so is giving me a 404 code sending me to domain2.
#RewriteCond %{QUERY_STRING} ^n=([A-Za-z0-9]+)$ [NC]
#RewriteRule ^index\.php$ http://domain.com/page/? [R=301,L]
その場合、http://domain.com/page/
は無効なURLのように見えますが、クエリ文字列に含まれる情報も削除し、「ユーザーフレンドリー」URLに渡さないようにします(すべてのURLが同じURLにリダイレクトされます)無効なURL)。
また、ユーザーフレンドリーなURLが機能するためにクエリ文字列を含むURLに内部的に書き換えているため、リダイレクトループに注意する必要がありますが、クエリ文字列を含むURLをリダイレクトしてコンテンツの重複を防ぐ必要もあります。
クライアントから送信された完全なHTTPリクエストを保持し、書き換え後に変更されない%{THE_REQUEST}
をチェックすることで、リダイレクトループを回避できます。
したがって、最初の「ページ」URLの場合:
RewriteCond %{THE_REQUEST} \?n=([A-Za-z0-9]+)$
RewriteRule ^index\.php$ /page/%1? [R=301,L]
URLのパターン[A-Za-z0-9]
(例から引用)は、書き換え[A-Za-z0-9-+_\s]
(スペースを許可します!?)のパターンよりも制限が厳しいことに注意してください-両方のパターンは同じで、許可しないスペース。 (THE_REQUEST
にはスペースが含まれているため、本当に必要な場合は正規表現を変更する必要があります。)
編集:以下の更新を考慮して(2つのパラメーターを許可するため)、上記のRewriteCond
ディレクティブに$
(位置マーカー)を追加して、文字列。現在、これはonlyで1つのURLパラメーターを許可します。
そして、外部リダイレクトは内部書き換え(とにかく行われたように見える)の前に来るはずです。
PDATE: 2番目のパラメーター(コメントに記載されているとおり)には、次のディレクティブを追加します。
RewriteCond %{THE_REQUEST} \?n=([A-Za-z0-9]+)&y=([A-Za-z0-9]+)$
RewriteRule ^index\.php$ /page/%1/%2? [R=301,L]
これにより、正確に2つのパラメーター(n
およびy
の順序)がチェックされ、それに応じてリダイレクトされます。
(1つのパラメーターについて上記の最初のルールを編集することに注意してください。)
Apacheの前でプロキシを使用できますか? Varnishのようなものがあなたのために書き換えを行うことができます、そしてあなたが懸念を分離するにつれて、リダイレクトループなどを構築するリスクを減らします。そして、それはあなたのウェブサイトをスピードアップします...
サーバーでプロキシを実行できない場合は、外部サービスの使用を検討することもできます。私が実行しているサービスはそうであり、私はそれがうまくいくと思います。プロフィールのURLをご覧ください。