1

いくつかのパラメーターを取得し、それらを変換してvarsを取​​得し、それらをスクリプトに渡すための書き換えルールを取得しようとしています。

したがって、.htaccessには次のものがあります。これは機能します。

RewriteEngine on

RewriteBase /cms/

RewriteRule ^services$  list.php?type=services  [L]

次に、スクリプトへの直接アクセスを停止 する別のルールを追加したいと思いましたlist.php。だから私は以下を追加しました:

RewriteRule ^list.php   -    [F,NS]

次のようなURLにアクセスしようとすると、何らかの理由で「禁止」エラーが発生します。

/cms/services

リクエストが内部サブリクエストでない場合、フラグによってこれにアクセスできなくなると思いましたが、スクリプトへのアクセスがまったく停止しているようです。

誰かが私がここでどこが間違っているのか教えてもらえますか?私は何日もこれに頭を悩ませようとしてきました。.htaccessファイルは、仮想ホストのエイリアスを介してアクセスされるディレクトリにありますが、2番目のルールを削除すると、最初のルールが期待どおりに機能するように、htaccessが読み取られていることがわかります。

4

2 に答える 2

2

あなたはサブリクエストの問題について正しいです。[NS]フラグは、このルールが内部サブリクエストに適用されないようにする必要があります。なぜそれが期待どおりに機能しないのかわかりません(ディレクトリセクションではなく.htaccessにいるためですか?mod_aliasのためですか?)。とにかく、 REDIRECT_STATUS環境変数をテストする置換方法で試してみることができます。これは、このフラグよりも信頼性が高いことが証明されています。

試してみましょう(テストされていません)。フラグには長い名前のバージョンを使用することを好みます。mod_rewriteはすでに十分に難読化されていると思います。ルールの順序は重要ではないことにも注意してください。フラグがあっても[last]、ルールの結果はルールセットに再適用されます。

RewriteEngine on
RewriteBase /cms/

# RULE 1
# This rule will apply only from  a direct user access.
# If any other rewrite made an internal redirect we'll skeeze that rule
# so if access is provided after an internal redirect it's ok
# we catch it via the env variable REDIRECT_STATUS which must be empty
RewriteCond %{ENV:REDIRECT_STATUS} ^$  
# 403 FORBIDDEN if the user request direclty list.php!
RewriteRule ^list.php - [forbidden,last]

# RULE 2
# any request to service is in fact internally
# redirected to list.php?type=services
RewriteRule ^services$  list.php?type=services  [nocase, last]
于 2012-05-22T08:17:10.577 に答える
1

特定のファイルにアクセスできないようにするには、次のようにしてください。

<files list.php>
order allow,deny
deny from all
</files>

これで、list.phpファイルにアクセスしようとすると、403エラーメッセージが表示されます。同様に、htaccessファイルへのアクセスを防ぐことができます。

于 2012-05-22T07:55:02.553 に答える