web-dev-qa-db-ja.com

単一ルールのApache大文字と小文字を区別しないmod_rewrite

検索エンジンに適したURLにmod_rewriteを使用しています。私はうまく機能するこの行を持っています:

RewriteRule ^Pay ./pay.php [L] #Pay

ただし、訪問者がhttp://example.com/pay(小文字に注意)と入力した場合にも一致させたいと思います。 NCを使用しようとしましたが、500エラーが発生します。大文字と小文字の2つの別々のルールを作成しようとしましたが、500エラーになりました。

これは正規表現を使用して1行で実行できますか?何かのようなもの:

RewriteRule ^([P-p])ay ./pay.php [L] #Pay

もしそうなら、適切な方法は何ですか?そうでない場合、mod_spellingを使用せずにこれをどのように達成できますか?

1
Sabyre
RewriteRule ^Pay ./pay.php [L] #Pay

無限の書き換えループが原因で500エラーが発生します。上記の大文字と小文字を区別しないようにすると、URLが書き換えられます。 /pay.phpは現在と一致します大文字と小文字を区別しないパターン^Payなど。

この場合、パターンをより制限的にし、「pay」だけに一致させることができます。単にstarts "pay"であるURLパスではありません。例えば:

# Pay
RewriteRule ^pay$ pay.php [NC,L]

susbstitution./プレフィックスも削除しました。これは必須ではありません。また、Apacheは行末コメントをサポートしていません。

ただし、この書き換えで大文字と小文字を区別しないようにすると、重複コンテンツになる可能性があることに注意してください。

0
MrWhite

ケースに影響されない単純な書き換えルールについてはわかりませんが、Pまたはpを一致させようとする試みはほぼ修正されています。ダッシュと角かっこを省略するだけで機能します。これは私があなたのためにテストしたものです(可能な限り単純です):

RewriteRule ^/[Pp]ay /pay.php

角括弧内の文字は1文字の代替にすぎないため、

RewriteRule ^[Pp][Aa][yY] /pay.php

小文字と大文字の任意の組み合わせに一致します。ただし、バージョンが機能しなかった理由はわかりません。これは、「Pとpの間の任意の文字に一致する」という意味であり、P、Q、R、... Z、some-punktuation、a、bである必要があります。 、c ... p。私はあなたのバージョンをテストしていません。

角かっこ()は害を及ぼすべきではありません。単に「そこにあるものをすべて抽出し、置換文字列の「$ 1」としてアクセスできるようにする」という意味です。

提案:静的ファイルで試してください。ダミーコンテンツ(「これはtest.html」など)を使用してtest.htmlを作成し、テストしているWebサーバーを介してブラウザーでアクセスしてみます。次に、ルールを追加します

rewriterule ^/best.html$ /test.html

best.htmlにアクセスします-test.htmlが表示されます。うまくいかなかった部分が見つかるまで、書き換えルールの小さな部分を変更し続けます。

0
TomTomTom