スペースが含まれているURLをリダイレクトする方法
このURLからリダイレクトしています
www.example.com/article.php?id=12&title=some-title
このURLへ
www.example.com/article/12/some-title
これらのURL書き換えルールの使用
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(article)\.php\?id=(\d+)&title=([\w-]+)\ HTTP
RewriteRule ^article\.php$ /%1/%2/%3? [R=301,L]
RewriteRule ^article/(\d+)/([\w-]+)$ article.php?id=$1&title=$2[R=301,L]
ただし、たとえばURLにスペースが含まれている場合
www.example.com/article.php?id=12&title=some%20title
その場合、上記のルールは機能しません。このURLを上記のルールでのみ使用して機能させるにはどうすればよい.htaccess
ですか?
回答
RewriteRule ^article/(\d+)/([\w-]+)$ article.php?id=$1&title=$2[R=301,L]
ちょっとした副次的な問題ですが、フラグの前にスペースがないRewriteRule
ため、誤った書き換えが発生します。次のようになります...&title=$2 [R=301,L]
。
スペース文字に関して(%20
URL /パーセントエンコードの場合)...THE_REQUEST
にはURLエンコード文字が含まれますが、RewriteRule
パターンと照合されるURLパスはURLデコードされます(つまり、リテラルスペース)。上記の例では、これは2つの異なる正規表現パターンを意味します。したがって、のスペースに一致させるために、次のtitle
ような既存のルールを変更できます。
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(article)\.php\?id=(\d+)&title=([\w%-]+)\ HTTP
RewriteRule ^article\.php$ /%1/%2/%3? [NE,R=301,L]
RewriteRule ^article/(\d+)/([\w\s-]+)$ article.php?id=$1&title=$2 [R=301,L]
各ディレクティブはわずかに変更されています。
- CondPatternのは今リテラルパーセント文字(すなわち。することができます
[\w%-]
)。 - URLエンコードされたスペースが二重エンコードされない
NE
ようにRewriteRule
するために、次のフラグが必要です(例%2520
)。 - そして最後に
RewriteRule
は\s
、パターンに(空白文字を)追加する必要があります。(または、あなただけのバックスラッシュが。つまり、スペースをエスケープ使用することができ\
、または単にスペースと全体囲むパターン二重引用符では。)
これにより、追加のスペースが許可されます。がCondPatternのは、今ことができます任意のパーセントエンコードされた文字を、RewriteRule
パターンにこれを制限空白。
更新#1:いくつかの追加文字を許可するには... [\w%-]
(角括弧の間のすべて)は正規表現文字クラスです。より多くの文字を許可するには、これらの文字を文字クラスに追加するだけです。例えば。以下の場合,
、'
及び;
、これはなり[\w%,';-]
。ハイフン(-
)は特殊なメタ文字であるため、文字クラスの最初または最後に表示する必要があることに注意してください。
任意の文字を許可するには、パターンをに変更できます.+
。これは単に1文字以上です。ドットは任意の文字を示します。したがって、これは次のようになります。
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(article)\.php\?id=(\d+)&title=(.+)\ HTTP
RewriteRule ^article\.php$ /%1/%2/%3? [NE,R=301,L]
RewriteRule ^article/(\d+)/(.+) article.php?id=$1&title=$2 [R=301,L]