php - codex - wordpress plugin ajax call
URLを1つの標準形式に変換する (6)
ここにいくつかのURLがあります:
http://sub.example.com/?feed=atom&hello=world
http://www.sub.example.com/?feed=atom&hello=world
http://sub.example.com/?hello=world&feed=atom
http://www.sub.example.com/?hello=world&feed=atom
http://www.sub.example.com/?hello=world&feed=atom
http://www.sub.example.com/?hello=world&feed=atom#123
ご覧のとおり、これらはすべてまったく同じページにつながりますが、URL形式は異なります。 これは他に2つの基本的な例です。
http://example.com/hello/
http://example.com/hello
どちらも同じです。
URLをデータベースに保存するときに、URL文字列がすでにデータベースに存在するかどうかを簡単に確認できるように、URLを1つの標準形式に変換したいと思います。
URLのフォーマット方法にはさまざまな方法があるため、これは不可解です。
URLを1つの標準形式に変換するための最も確実な方法は何ですか? 多分parse_url()
route ...?
編集する
コメントで概説されているように、これに対する明確な解決策はありませんが、目的はページを 「検索」 せずにできる限り近づけることです。 この賞金に対する答えを投稿する前に、コメントを読んでください。
HTMLヘッダーに優先する<link rel="canonical" ... >
タグを追加することが、一意のコンテンツを単一のSEF URL
に参照するための唯一の信頼性の高い解決策です。 重複したURLの統合に関するGoogleのドキュメントを参照してください。
それらのサーバの.htaccess
rewrite-rulesやHTMLヘッダを解析することなく、正規のURLを知ることや束の外部URLを解決することができるという考えは、適切ではないようです(単にURLエイリアスでテーブルを維持できるため)これはその後、HTTPリクエストがどのように書き直されたかを推測することを許可しません。
この質問はhttps://webmasters.stackexchange.com/search?q=cannonical属している可能性がありhttps://webmasters.stackexchange.com/search?q=cannonical 。
URLが重複している場合も同様です。URLファクトリを使用して、適切なURLに対して適切ではないすべてのURLをリダイレクトすることで、このような種類の重複したURLを回避できます。
この記事でも同じことが説明されています。
https://www.tinywebhut.com/remove-duplicate-urls-from-your-website-38
同じページにつながる他のすべてのURLは、正しいバージョンのURLにリダイレクトされます。
これが検索エンジン最適化(SEO)のベストプラクティスです。 ここでは、いくつか例を挙げます。
あなたはこのウェブサイトのURLを考慮することができます、例えばこのページの間違ったリンクは
https://.com/questions/51685850
https://.com/questions/51685850/convert-url-into-one-s
https://.com/questions/51685850/
このページの上記の間違ったURLにアクセスすると、正しいURLにリダイレクトされます。
https://.com/questions/51685850/convert-url-into-one-standard-format
この質問のタイトルを変更すると、他のすべてのURLは適切なURLにリダイレクトされます。 ここでの考え方は、検索エンジンに古いURLを新しいURLに置き換えるように指示する301リダイレクトです。それ以外の場合、検索エンジンは同じコンテンツを提供する異なるURLを見つけます。
ここでの本当の取引は、問題のID、 51685850
です。 このIDは、データベースからの情報を使用して適切なURLを作成するために使用されます。 提供されたリンク内の記事で作成されたURLファクトリを使用すると、データベースにURLを格納する必要すらありません。
あなたはここで重複したコンテンツについてもっと読むことができます:
https://moz.com/learn/seo/duplicate-content
同じ規則がtinywebhut.comにも適用され、間違ったURLは
https://www.tinywebhut.com/remove-duplicate-38
https://www.tinywebhut.com/some-text-38
https://www.tinywebhut.com/remove-duplicate-urls-from-your-website-38/
上記のURLでは、IDはURLの末尾の38
追加されています。これらのURLのいずれかにアクセスすると、適切なバージョンのURLにリダイレクトされます。
https://www.tinywebhut.com/remove-duplicate-urls-from-your-website-38
この記事ですでに説明しているので、ここで説明するための関数は作成しませんでした。
https://www.tinywebhut.com/remove-duplicate-urls-from-your-website-38
あなたはいくつかの非常に単純な機能で目的を達成することができます、そしてあなたは/about.php
、 /about
/about.php
/about
、 /about
などのような他の重複したURLを削除するために同じ考えを適用することができます。 そしてこれを達成するためにあなたはあなたの既存の機能にもう少しコードが必要です。
たとえば、同じページに移動するためのURLが複数ある場合でも、標準タグを追加してリンクを適切なURLに追加するだけで済みます。
<link rel="canonical" href="https://.com/questions/51685850/convert-url-into-one-standard-format" />
このようにして、複数のURLを1つのURLと見なし、検索エンジンが正規タグで使用されているリンクを検索結果に追加するように検索エンジンに指示します。 正規化の詳細については、こちらを参照してください。
https://moz.com/learn/seo/canonicalization
それでも、重複したコンテンツを取り除くための最善の方法は301リダイレクトです。 あなたが私が最初に話したように301リダイレクトを持っているならば、すべての問題は驚きなしで解決されます。
reports-configuration-save機能についても同じ問題がありました。 私たちのシステムでは、ユーザーは自分自身の売上レポートをデザインすることができます(JQL of Jiraのように)。 そのために、次のように、条件としてget paramsを使用し、レイアウト設定としてフラグメント識別子(#の後)を使用します。
http://example.com/report.php?since=20180101&until=20180806#sort=amount&color=blue
私たちのシステムでは、GETの順序や#paramsの後は関係ありません。また、paramを "until"、 "until"、 "since"の順に設定した場合も同じレポート設定になります。
これを考慮して、サブドメインは議論の余地がないので、書き換え技術(Apacheの301でのmod_rewriteのような)を使用してこれを解決するか、またはソフトウェアレベルでこれを行うためにドメイン例外のプールを作成しなければなりません。 また、ドメインが異なるとWebサイトが異なる可能性があるため、適切かどうかを判断する必要があります。 サブスペースでは "www"はそれを理解するのがとても簡単ですが、それは別のケースではあなたの時間を浪費するでしょう。
サーバーサイドはクエリセクションで変数を取得するのに役立ちます。 たとえば、PHPでは、配列を取得するために関数parse_strと$ _SERVER ['QUERY_STRING']を使用できます。次に、asort()を使用して、同じリクエストであるかどうかを最後に比較する必要があります(array_diff関数)。
残念ながら、ハッシュ(#)コンテンツを取得する機能がないため、サーバー側には選択肢がありません。また、scriptname、プロトコル、ポートなど、他の問題については考慮されていません。
http://www.sub.example.com/index.php?hello=world&feed=atom
https://www.sub.example.com/?hello=world&feed=atom
http://www.sub.example.com:8081/?hello=world&feed=atom
私の個人的な経験では、URLを処理し、クエリセクションを配列として解析し、それらを比較してフラグメント識別子を使用して同じことを行うための最も近い解決策はJavaScriptです。 サーバー側でそれを使用する必要がある場合は、すべてのロードページの後に、このデータをサーバーに送信するajax要求が続く必要があります。
私の答えの長さのために事前に謝罪します、しかしそれはあなたが持っているのと同じ問題を解決するために私が経験しなければならなかったものです。 ご挨拶
URLからプロトコル、ドメイン、およびポートを取得する URLからプロトコル、ドメイン、およびポートを取得する
JavaScriptでクエリ文字列値を取得する方法 JavaScriptでクエリ文字列値を取得する方法
URLからフラグメント識別子(ハッシュ番号の後の値)を取得する方法 URLからフラグメント識別子(ハッシュ番号の後の値)を取得する方法
parse_url
をparse_url
後
- ドメイン名から
www
プレフィックスを削除します - パスが空でない場合 - 末尾のスラッシュを削除します
- クエリパラメータを名前のアルファベット順に並べ替えます(存在する場合)。
正規のURLを取得するためにこれらの部分を結合してください。
全ての答えは素晴らしい情報を持っています。 あなたがApacheのようなサーバを使っていると仮定すると、URLビットには、.htaccess(あるいは、できればそれを変更できるなら - 同等のサーバのApache設定ファイル)を使って書き換えます。 簡単な例では:
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule (.*) http://example.com/$1 [R=Permanent]
この例では、 " R=Permanent
" DOESがリダイレクトを行います。 a)リダイレクトを記憶するようブラウザに指示します。b)内部リンクはおそらく相対リンクなので、プロトコル(httpまたはhttps)とサーバー(example.comなど)は保持されるので、これは通常大きな問題ではありません。 そのため、一般的にリダイレクトはセッションごとに1回以下になります。IMOは、PHPでこれらすべてを行わないようにするために十分な時間を費やしています。
私はあなたが同様に質問ビットの順序を書き直すためにそれを使うことができると思います、しかし質問ビットが重要であるとき、私は(あなたがそうすることを勧めません、ちょうどsayin ')私のパスにそれらを加える傾向があり.../blah/atom
"to" .../blah.php?feed=atom
") とにかく、利用可能な書き換えトリックがたくさんあります、そして私はあなたがApache mod_rewriteでそれらについて読むことを勧めます。
あなたがこの道をたどるなら、あなたが何をしたいのかを慎重に考えていることを忘れないでください - あなたがURLのことをいじり始めると、あなたは通常長い間あなたの決定に行き詰まっています。
私の最初の答えは、「ご覧のとおり、全ページがまったく同じページに表示されますが、URL形式が異なります...」という行に従って、すべてのページがOPによって所有されていることを前提としています。 私は答えを複数のオプションを処理するように適応させ、URLに関してあなたができることとできないことの仮定のリストを追加しています。
他の人が指摘したように、ページが同じであることを知らないのであれば、これに対する明確な簡単な答えはありません。 しかし、あなたがこれらの仮定に従うならば、あなたはいくつかのことを安全に標準化するべきです:
可能性があります
同じ値を持つクエリ文字列は、順序に関係なく同じ場所を指します。 例: https://example.com/?fruit=apple&color=red : https://example.com/?fruit=apple&color=redはhttps://example.com/?fruit=apple&color=redと同じですhttps://example.com/?color=red&fruit=apple
301特定のソースへのリダイレクトに従うことができます。 301リダイレクト応答を受け取った場合は、リダイレクトに従ってそのURLを使用してください。 URLが実際には同じページを指していて、ページランクが最適化されている場合は、それに従うことができます。
HTML内に単一の
<link rel="canonical">
タグがある場合は、それも正規のリンクをカバーするために使用できます(理由は下記を参照)。
できない問題
URLが異なる場合、どのURLも他のURLと同じであることが保証されています(この場合のURLでは、クエリ文字列の前にあるものについて説明しています)。
- http://example.comはhttps://example.comと異なる場合がありますhttp://www.example.comまたはhttps://www.example.comと異なる場合があります 。 "www"を入れたり除外したりするときに別のWebサイトを表示することに対する制限はありません。 だからこそ、検索エンジンのページランクがここでは本当に損なわれているのです。
現在2つのURLがまったく同じ内容であっても、 まったく同じ内容が保持されます。 例はhttps://example.com/testおよびhttps://sub.example.com/testです。 両方とも、同じ一般的なテストページのコンテンツに設定することができます。 将来、 https://sub.example.com/testが変更される可能性があります。 あなたはそれがそうではないと仮定することはできません。
あなたがサイトを所有している場合
必要なURL形式の最初の部分にすべてのトラフィックをリダイレクトしますsub.example.com
、 example.com
またはsub.example.com
どちらをごsub.example.com
ですか? 末尾にスラッシュが必要ですか。 サーバールールまたはPHPを使用して、これを最初にリダイレクトします。 これは検索ページのランク付けにも非常に有益です(それがあなたにとって重要な場合)。
この例は、このようなものです。
if (!$_SERVER['HTTPS'] || 'example.com' !== $_SERVER['HTTP_HOST'] || rtrim($_SERVER['PHP_SELF'], '/') !== $_SERVER['PHP_SELF']) {
header('HTTP/1.1 301 Moved Permanently');
header('Location: '. 'https://example.com/'.rtrim($_SERVER['PHP_SELF']), '/'));
exit;
}
最後に、残りのSEOの懸念を管理するために、このHTMLタグを追加することができます。
`<link rel="canonical" href="<?php echo $url; ?>">`
サイトを所有しているかどうかにかかわらず、クエリの順序を標準化できます。
サイトを管理していなくても、クエリの順序は重要ではないと考えることができます。 これを標準化するには、クエリを取得してパラメータを再構築し、それを正規化されたURLに追加します。
function getSortedQuery()
{
$url = [];
parse_str($_SERVER['QUERY_STRING'], $url);
ksort($url);
return http_build_query($url);
}
$url = $_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.getSortedQuery();
別のオプションは、ページのコンテンツを取得して<link rel="canonical">
文字列があるかどうかを確認し、その文字列を使用してデータを記録することです。 全ページロードが必要なので、これはもう少しコストがかかります。
繰り返しますが、最終的な結果のURLに関しては、301個のリダイレクトが候補ではなくディレクティブであるため、必ず301個のリダイレクトを取得してください。
最後の提案
2つの列を使用することをお勧めします。一方は "canonical_url"、もう一方は "effective_url"です。 URLが機能して、後で301リダイレクトになることがあります。 これは私の考えですが、私はこれらのことを知りたいのです。