スペースが含まれているURLをリダイレクトする方法

Dec 30 2016

この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ですか?

回答

1 MrWhite Dec 30 2016 at 10:15
RewriteRule ^article/(\d+)/([\w-]+)$ article.php?id=$1&title=$2[R=301,L]

ちょっとした副次的な問題ですが、フラグの前にスペースがないRewriteRuleため、誤った書き換えが発生します。次のようになります...&title=$2 [R=301,L]

スペース文字に関して(%20URL /パーセントエンコードの場合)...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]