0

私のサーバーには、次の内容の .htaccess ファイルがあります。

RewriteCond %{HTTP_HOST} ^myhost.local$
RewriteRule ^default/.*$ /index.php?id=12345 [L]

RewriteCond %{HTTP_HOST} ^myhost.local$
RewriteCond %{REQUEST_URI} ^/?$
RewriteRule ^(.*)$ http://myhost.local/default/home [R=302,NC]

この現象は、 http://myhost.local/ をリクエストすると、予想どおりhttp://myhost.local/default/homeに 302 リダイレクトされるのではなく、http://myhostに 301 (!) リダイレクトされることです。 .local/、無限ループになります。

もう 1 つの奇妙な点は、^/$私の URL と一致するはずなのに一致しないように見えることです^/?。そのため、何らかの理由で疑問符を使用する必要があります。一致がない場合はいつでも、書き換えは発生しないため、無限ループは発生しません。したがって、これは、条件が満たされている場合、リダイレクト先のコードのみが完全に無視されている場合に、私RewriteRuleの for^(.*)$が実際に取得されるというさらなる証拠です。

記録のために、次の形式のルールも用意しました。

RewriteCond %{HTTP_HOST} ^myhost.local$
RewriteRule ^default/.*$ /index.php?id=12345 [L]

RewriteCond %{HTTP_HOST} ^myhost.local$
RewriteRule ^/?$ http://myhost.local/default/home [R=302,NC]

これは、最初の例とまったく同じ結果になりました。

実際に指定した URL ではなく、リダイレクトが発生する原因は何ですか?

注意事項:

  • この .htaccess ファイルには他のエントリがあります
  • この .htaccess ファイルは DOCUMENT_ROOT 内にあります
  • デフォルトの VirtualHost がRewriteOptions inherit設定されています
4

1 に答える 1

0

犯人は同じ .htaccess ファイル内にありました。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^.+/.* http://%{HTTP_HOST}/ [R=301,L]

301も簡単に説明しました。

于 2013-10-22T16:51:23.263 に答える