4

クイック リファレンス: エリア = ポータル タイプのページ。

古い URL http://domain.com/long/rubbish/url/blah/blah/index.cfm?id=12345をhttp://domain.com/area/12345-short-title にリダイレクトしてほしい

http://domain.com/area/12345-short-titleにコンテンツが表示されます。

これまでのところ、Apache を使用してすべての URL を書き込むことができました。

http://domain.com/ index.cfm /long/rubbish/url/blah/blah/index.cfm?id=12345 および http://domain.com/ index.cfm /area/12345-short-title

index.cfm は、コンテンツを提供するか、恒久的なリダイレクトを適用しますが、最初にデータベースからタイトルとエリアの情報を取得する必要があります。

このウェブサイトには 50,000 ページがあります。また、サブドメインのリダイレクト、永続的なサブドメイン、および index.cfm によるサブドメインの動作の制御に関する他のアイデアもあります。

インフラストラクチャは、Apache の書き換えによって可能な限り多くのことを行うことに熱心であり、より高速になると思われます。ただし、各ページの領域とタイトル情報を取得する必要がある場合、その選択肢があるかどうかはわかりません。

誰かが入力を提供できるこれに関する経験を持っていますか?

--

注意すべき点として、Web サイトで使用されているすべての内部 URL を古い形式のままにしておく必要があると思います。それらをすべて変更するのは大仕事です。

これは、すべての内部 URL が毎回恒久的なリダイレクトを使用する必要があることを意味します。

4

2 に答える 2

3

URL の両方のグループを同じスクリプトにリダイレクトするのではなく、単純に 2 つの異なるスクリプトに送信してみませんか?

単に次のように:

RewriteCond ${REQUEST_URI}  !-f
RewriteRule ^\w+/\d+-[\w-]+$ /content.cfm/$0 [L]

RewriteCond ${REQUEST_URI}  !-f
RewriteRule ^.* /redirect.cfm/$0   [L,QSA]

次に、redirect.cfm は置換 URL を検索して 301 リダイレクトを実行できますが、content.cfm は単にコンテンツを提供します。

(CF のセットアップ方法を指定していません。サポートするために Jrun/Tomcat/other 構成を更新する必要がある場合があります。これは、index.cfm の場合/content.cfm/*/redirect.cfm/*同じように行われます)


パフォーマンス上の理由から、可能であればリダイレクトのデータベース ヒットを回避する必要があります。これは、Apache 側で 301 リダイレクトを実行するページごとに書き換えルールを生成することで実現できます。これは、次のように .htaccess ファイルに行を追加するだけで簡単に実行できます。

<cfset NewLine = 'RewriteRule #ReEscape(OldUrl)# #NewUrl#   [L,QSA,R=301]' />

<cffile action="append" file="./.htaccess" output=#NewLine# />

(OldUrl と NewUrl がデータベースから検索された場所。)

mod_rewrite RewriteRule の代わりにmod_alias リダイレクトを使用して調査することもできます。構文は次のとおりRedirect permanent #OldUrl# #NewUrl#です。OldUrl は正確なパス一致であるため、より高速になる可能性があります。

これらのルールは、上記の redirect.cfm リダイレクトを行うに確認する必要があることに注意してください。それらが同じ .htaccess にある場合、単純に追加することはできませんが、サイトの一般的な Apache 構成ファイルにある場合は、. htaccess ルールが最初にチェックされます。

また、Sharon のコメントによると、Apache が 50k のルールを処理できるかどうかを確認する必要があります。「数千」の正規表現ベースの Apache 書き換えが完全に問題ないと報告されているのを見てきましたが、何らかの制限がある可能性があります (または少なくとも複数のファイルに分割する必要があります)。

于 2012-10-11T13:57:26.917 に答える
0

Apache の書き換えを使用すると、それらが静的な書き換えであるか、.htaccess ファイル内で正規表現で記述できる何らかの規則に従っている場合にのみ高速になります。これらのリダイレクトのためにデータベースに触れる必要がある場合、.htaccess でそれを行うのは意味がないかもしれません。

もう 1 つのアプローチは、ほとんどの CMS で仮想ディレクトリとリダイレクトを処理するために使用されるものです。サイトのルートにある index.cfm ファイルは、すべての着信要求を処理し、正しいページとパスを返します。MURA CMS はこのアプローチを使用します (Joomla やその他のほとんどと同様)。

基本的に、着信リクエストで CGI.path_info 変数を使用し、DB で検索して、新しいパスにリダイレクトします。いつものように、Ben Nadel はこのアプローチの使用方法について適切な記事を書いています: Ben Nadel: Using IIS URL Rewriting And CGI.PATH_INFO With IIS MOD-Rewrite

ただし、.htaccess で次のようなものを使用して、すべての着信要求をルート URL にリダイレクトすることにより、.htaccess を使用して URL 文字列から「index.cfm」を完全に削除することができます。

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^([a-zA-Z0-9-]{1,})/([a-zA-Z0-9/-]+)$ /$1/index.cfm/$2 [PT]

基本的に、これは http://www.yourdomain.com/your-new-url/ のようなものを http://www.yourdomain.com/index.cfm/your-new-url/ にリダイレクトそこで説明されているように処理できます上記のブログ投稿による。ユーザーには index.cfm が表示されません。

于 2012-10-11T14:30:50.067 に答える