web-dev-qa-db-ja.com

パラメータから読み取り可能なURLへの変更301リダイレクト

私は最近、パラメータ付きの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]
2
rrrfusco

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つのパラメーターについて上記の最初のルールを編集することに注意してください。)

1
MrWhite

Apacheの前でプロキシを使用できますか? Varnishのようなものがあなたのために書き換えを行うことができます、そしてあなたが懸念を分離するにつれて、リダイレクトループなどを構築するリスクを減らします。そして、それはあなたのウェブサイトをスピードアップします...

サーバーでプロキシを実行できない場合は、外部サービスの使用を検討することもできます。私が実行しているサービスはそうであり、私はそれがうまくいくと思います。プロフィールのURLをご覧ください。

0
mathieubolla