0

このコードを含む「.htaccess」ファイルがあります:(
「P7-product_number_7」のような名前をリダイレクトする必要があります)

RewriteEngine On
RewriteBase /
# if:
RewriteCond %{DOCUMENT_ROOT}/cache%{REQUEST_URI}.html -f
# then:
RewriteRule ([A-z])([0-9]+)-([^/]*)?$ /cache%{REQUEST_URI}.html [B,L]
# else:
RewriteRule ([A-z])([0-9]+)-([^/]*)?$ index.php?type=$1&id=$2&label=$3 [B,L]

('cache'ディレクトリ内の)ファイルの存在のチェックは正常に機能しますが、リダイレクトは機能しません。
なんで ?

最初のRewriteRuleの代わりに「 RewriteRule^(。*)$ /cache/$1.html [L] 」を使用しようとしましたが、うまくいきませんでした。
(HTMLファイルが(/ cache /に)存在しない場合のリダイレクトは正常に機能します。「。htaccess」および「cache/」ディレクトリは「/var / www」ディレクトリにあるため、%{REQUEST_URI}は「/P7」になります。 -product_number_7 ")

4

1 に答える 1

1

URIの先頭をチェックしていないため、ルールがループしています。label $ _GETパラメータがproduct_number_7.html.htmlであり、最後にが付いていることに気付くかもしれません。これは、最初のルールが適用され、次にルールがループすることを意味しますが、2回目は最初の条件が失敗するため(がないP7-product_number_7.html.htmlため)、2番目のルールが適用されます。

  1. URI =/P7-product_number_7
  2. 状態チェック:%{DOCUMENT_ROOT}/cache%{REQUEST_URI}.html -f-> true
  3. ルールの適用:一致([A-z])([0-9]+)-([^/]*)?$-> true
  4. URIはに書き直されました/cache/P7-product_number_7.html
  5. URIを開始/P7-product_number_7!= /cache/P7-product_number_7.html、エンジンループを書き換えます:
    1. URI =/cache/P7-product_number_7.html
    2. 状態チェック:%{DOCUMENT_ROOT}/cache%{REQUEST_URI}.html -f-> false/cache/cache/P7-product_number_7.html.html存在しません)
    3. ルールの適用:一致([A-z])([0-9]+)-([^/]*)?$-> true(URIの/ cache / P7-product_number_7 .html部分に一致)
    4. URIはに書き換えられます/index.php?type=P&id=7&label=product_number_7.html

したがって、ルールの最初に書き換えのないパススルーを追加する必要があります。

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

または、正規表現のURIの先頭と単純に一致させることができます。

# need ^ ---v
RewriteRule ^([A-z])([0-9]+)-([^/]*)?$ /cache%{REQUEST_URI}.html [B,L]
# and here -v:
RewriteRule ^([A-z])([0-9]+)-([^/]*)?$ index.php?type=$1&id=$2&label=$3 [B,L]
于 2012-09-27T16:59:01.870 に答える