1

動的ページをディレクトリにリダイレクトしようとしています。例:

url.com/index.php?page=download
to
url.com/download

ルールは非常に単純です。

RewriteRule ^download$ /index.php?page=download

完全な .HTACCESS

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.url\.com$
RewriteRule ^(.*) http://url.com/$1 [R=301,L]

Redirect 301 /index.php?page=download http://url.com/download
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
RewriteRule ^download$ /index.php?page=download

問題は、既に「download」という名前のディレクトリがあり、「403 Forbidden Error」が返されることです。ディレクトリの名前を、ルールが使用している名前 (ダウンロード) とは異なる名前に変更すると機能することに気付きました。

だから、私の質問は次のとおりです。必要な方法でURLを書き換えて、ディレクトリを保持するにはどうすればよいですか?

- 編集 -

私のサーバーは、デフォルトですべてのディレクトリを「403 Forbbiden Error」で保護しています。これが機能しない理由だと思いますが、よくわかりません。それは本当に紛争ですか?何が起こっている?

4

2 に答える 2

0

あなたの問題は、この特定の書き換えルールによるものだと思います:

 RewriteRule .* - [L]

Apache は htaccess を 1 行ずつ詳細に読み取り、各書き換えルールを順番にマップしようとします (+ 条件、明らかに)。詳しく追ってみましょう。

 RewriteCond %{HTTP_HOST} !^www\.url\.com$
 RewriteRule ^(.*) http://url.com/$1 [R=301,L]

これら 2 つだけでは問題ありませんが、問題の原因ではありません。HTTP HOST が www.url.com 以外の場合、http://url.com/ ... にリダイレクトされますが、これは www.url.com ではなく、url.com にリダイレクトされます。潜在的な無限ループがありますが、それは HTTP HOST が最初から www.url.com でない場合のみです。一致した場合、L フラグにより​​、処理が中断され、リダイレクトが返されます。

Redirect 301 /index.php?page=download http://url.com/download

この行は問題ありません。あなたはたまたま index.php?page=download を知っている人に 301 リダイレクトを行っています。

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

この行は問題ありません。書き換え条件は、これまでのところ、上記からのリダイレクトでないものはすべて次のルールで機能することを指定します。次のルールはEVERYTHING (.* はすべてを意味します。0 文字以上の任意の文字) に一致し、- に in-rewrite します。これは、mod_rewrite 言語では do not touch フラグです。これで問題ありません。ただし、L フラグはチェーンを壊して を返します。これにより、download/ フォルダーが実際のダウンロード フォルダーのリストとして表示され、403 エラーの原因となります。

L フラグを削除して、次に処理するルールを取得します。

RewriteRule ^download$ /index.php?page=download

それ自体は問題ありません。

于 2013-05-02T20:42:09.720 に答える