1

.htaccess リダイレクトの正規表現の書き方を学んでいます。これまでのところ、期待どおりに動作しないいくつかの正規表現を除いて、必要なものはすべて把握できました。デスクトップ アプリケーションを使用して正規表現をテストしていますが、そこでは正常に動作しますが、.htaccess ファイルでは動作しません。

参考までに: RewriteBase はに設定されています/site/

これは着信 URL です。 /site/view-by-tag/politics/?el_mcal_month=3&el_mcal_year=2009

「政治」をつかんでリダイレクトしたい/site/tags/politics/

これが私が使用したものです:

RewriteRule ^view-by-tag/([a-zA-Z\-]+)/([a-zA-Z0-9\-\/\.\_\=\?\&]+) /tags/$1/ [R=301,L]

politicsURL に があるとリダイレクトが機能しないという問題があり、その?理由がわからないため、後ですべての文字のキャプチャを追加しました。上記の URL で、 を削除する?と正常に動作しますが、?がそこにあると何も起こりません。これには理由がありますか?

307からキャプチャしようとすると同じことが起こります/site/?option=com_content&view=article&id=307&catid=89&Itemid=55

この正規表現を使用しましarticle&id=([0-9]+) /?p=$1 [R=301,L]たが、やはり、?URL に があると、何をしてもリダイレクトが停止します。

その理由は何ですか?

問題の.htaccessファイルは、Wordpress ブログ (3.4.1) にあります。

4

2 に答える 2

0

見落としている点は、書き換えエンジンが URI をREQUEST_URIQUERY_STRINGの 2 つの部分に分割することです。クエリ文字列部分はルール一致文字列では使用されないため、それを探すためにルール正規表現パターンを構築しても意味がありません。

書き換え条件と条件正規表現を使用して%N変数を設定することにより、クエリ文字列からパラメーターをプローブして選択できます。

デフォルトでは、クエリ文字列が含まれていない限り、出力置換文字列にクエリ文字列が追加されます。この場合、[QSA] (クエリ文字列の追加) パラメーターを使用しない限り?someparam無視されます。

ID を取得する方法/site/?option=com_content&view=article&id=307&catid=89&Itemid=55は、次のようなものを使用することです。

RewriteCond %{QUERY_STRING} \bid=(\d+)

ルールの前に、これは%1307に設定されます。これを行う方法のより一般的な説明については、書き換えのドキュメントを参照してください。

于 2012-07-15T14:44:19.320 に答える
0

クエリ文字列は、操作する必要がある場合は で個別に処理RewriteCondする必要があり、 内で一致させるべきではありません。代わりに、クエリ文字列を含まないRewriteRule リクエストに一致させ、クエリ文字列をリダイレクトに追加するために使用します。QSA

RewriteRule ^view-by-tag/([A-Za-z-]+)/?$ /tags/$1/ [R=301,L,QSA]
# OR, if you don't want the rest of the query string appended, put a `?` onto 
# the redirect to replace it with nothing
RewriteRule ^view-by-tag/([A-Za-z-]+)/?$ /tags/$1/? [R=301,L]

実際には、リダイレクトQSAでは必要ないかもしれませんR。デフォルトの動作は、リダイレクトでクエリ文字列を渡すことだと思います。

307クエリ文字列からキャプチャする必要がある場合は、 で実行し、RewriteCondでキャプチャし%1ます。

# Capture the id in %1
RewriteCond %{QUERY_STRING} id=([\d]+)
# Redirect everything to /, pass %1 into p
RewriteRule . /?p=%1 [LR=301,L]
于 2012-07-15T14:36:08.590 に答える