1

スラッシュ(%2F)をその一部として含むURLクエリ文字列を書き換えルール(iisおよびapache)で処理する方法があるかどうか疑問に思いました。

例として:

www.domain.com/project/word1

に書き直されます

www.domain.com/project/index.php?word=word1

このルールを介して(iisで):

<rule name="Friendly">
    <match url="^(.+)$" ignoreCase="true" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="index.php?word={R:1}" appendQueryString="false" />
</rule>

またはアパッチで:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.+)$ index.php?word=$1

これは正しく機能します。

ただし、次のような場合があります。

www.domain.com/project/word1%2Fword2

リダイレクトする必要があります

www.domain.com/project/index.php?word=word1/word2

しかし、明らかにスラッシュ(%2F)が原因でエラー404が発生します。これを解決する方法はありますか?/ word2の部分を切り取って、www.domain.com / project / word1%2Fword2をwww.domain.com/project/index.php?word=word1にリダイレクトする必要がある場合でも

前もって感謝します

4

1 に答える 1

1

Apacheのmod_rewriteモジュール(IISについてはよくわかりません)では、RewriteRule パターン「(%デコードされた)URLパス(または、リクエストのコンテキスト)」

テスト後に私が経験しているのは、エンコードされたスラッシュがサーバーによってデコードされていないか、解釈されていないことです(私も404エラーが発生します)。

ただし、コンテンツをクエリ文字列引数として使用する場合(たとえばhttp://www.example.com/?path=word1%2Fword2)、ほとんどがURLエンコードURL部分であることに気付きます。これは、サーバーにエンコードされたスラッシュをURLパスの一部として解釈させたくないため、論理的です。この観察結果は上記の記述と矛盾することに注意してください。一粒の塩と一緒に取ってください。

解決

ただし、確認できるのは、書き換えに問題はないということwww.domain.com/project/word1/word2です。したがって、パス部分で使用されるURLのパットをエンコードしないことをお勧めしますが、代わりに許可された文字をホワイトリストに登録して、のような特殊文字を避けることをお勧めします?


試験結果

.htaccess:

RewriteRule ^(.+) index.php?word=$1 [L]

index.php:

<pre>
    <?php var_dump( $_GET, true ); ?>
</pre>

URL:http://test/word1%2Fword2

収量404。

URL:http://test/word1/word2

収量:

<?php
array (size=1)
  'word' => string 'word1/word2' (length=11)
?>
于 2013-02-26T09:01:57.013 に答える