2011-02-12 22 views
1

私は、URLの2種類があります。以前の私は、URL書き換えのために、この.htaccessを使用していた複数のURL書き換えルール(Pretify)

http://mydomain.com/npguar/en/products.php
http://mydomain.com/npguar/en/1/product_specification.php

を:

RewriteEngine on 
RewriteCond $1 !^(index\.php|assets|robots\.txt) 
RewriteRule ^([a-z]{2})/(.*) $2?language=$1 [L] 

その後、私は修正それはこれにもかかわらず動作しないようです。

RewriteEngine on 

RewriteCond $1 ^(product_specification\.php) 
RewriteRule ^([a-z]{2})/([0-9]{1,2})(.*) $3?language=$1&id=$2 [L] 

RewriteCond $1 !^(index\.php|assets|robots\.txt|product_specification\.php) 
RewriteRule ^([a-z]{2})/(.*) $2?language=$1 [L] 

答えて

2

元のルールの仕組みは次のとおりです。 URLを起動します。

http://mydomain.com/npguar/en/index.php?maybe=a-query 

は、専用のファイルシステムパスを取る:

npguar/en/index.php 

.htaccessを取得するために使用された接頭辞を削除します。

en/index.php 

マッチこれは正規表現に対して^([a-z]{2})/(.*) 。一致するので、処理が続行されます。

(en)/(index.php) 

この試合は後方参照$1 = en$2 = index.phpを定義しています。このようなURLの一部に一致した正規表現でのサブパターンがありました。

対応するRewriteCondを確認してください。最初の引数は$1で、文字列はenに展開されます。 2番目の引数は!で、正規表現はその文字列と一致しないため、条件は真です。

条件が戻っRewriteRuleに行くと置換文字列$2?language=$1を構築し、真であるので:

index.php?language=en 

これは内部リダイレクトですので、一緒に戻ってのorignal URLのビットを置きます。ここにクエリがあり、[QSA]フラグが指定されていないため、元のクエリ(maybe=a-query)が置き換えられます。

http://mydomain.com/npguar/index.php?language=en 

このURLは最初から処理するためにApacheに戻されます。書き換えルールが再度チェックされます([L]フラグはこれを防ぎませんが、一致しないため、ページが提供されます)。


このルールの問題点は、RewriteCond$1です。それは$2でなければなりません。上記の例ではRewriteCondはfalseになりますが、en/products.phpではtrueになります。

RewriteCondが意図したよりもはるかに緩慢なので、これはうまくいきます。

(en)/(1)(/product_specification.php) 

ので$1 = en$2 = 1、​​:正規表現は、このようなURL(第2 /がどこに行くに注意を)壊すため

新しいルールは、動作しません。次に、$1^product_specification.phpを比較します。一致しません。条件はfalseです。

代わりに、新しいルールは次のようになります。

RewriteCond $3 ^product_specification\.php$ 
      ^^       ^
RewriteRule ^([a-z]{2})/([0-9]{1,2})/(.*) $3?language=$1&id=$2 [L] 
            ^

.../product_specification.phpfooが一致しないように、私も最後に$を追加しました。)

同じルールが単純になります

RewriteRule ^([a-z]{2})/([0-9]{1,2})/(product_specification\.php)$ $3?language=$1&id=$2 [L] 
+0

ありがとうございます、実際には私のクエリで何が間違っていたのか説明できますか? – Shishant

+1

申し訳ありませんが、より明確になっているはずです。回答が編集されました。 – aaz

+0

ありがとう、大変ありがとうございます。 – Shishant

関連する問題