1

私はmod_rewriteを使用して、CMSで処理するためのクエリをPHPに送信しています。私の問題:クエリがディレクトリの名前である場合、PHPに送信されるクエリがURLに追加されます。

コードは次のとおりです。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /process.php\?query=$1 [QSA,NC,L]

したがって、ユーザーが入力した場合

http://example.com/lolcats

mod_rewriteはサイレントににリダイレクトします

http://example.com/process.php?query=lolcats

これは素晴らしいです。ただし、lolcatsがディレクトリの場合、mod_rewriteは(サイレントではなく)にリダイレクトします

http://example.com/lolcats/?query=lolcats

元のリクエストの最後にクエリを追加します。Apacheは引き続きPHP出力を提供しますが、ユーザーのアドレスバーのURLを変更します。

そのため、クエリがディレクトリの名前であっても、クエリがリクエストに追加されないようにする必要があります。

4

2 に答える 2

1

これはDirectorySlash問題であり、ディレクトリにアクセスしようとすると、apacheが末尾にスラッシュを付けてリダイレクトします。

オフにするか(これをオフにすることに関するセキュリティ警告があるDirectorySlash Offことに注意してください)、mod_rewriteに次のようなものでプリエンプティブに処理させることができます。

# Above your existing rules
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)$ /$1/ [R=301,L]

# and small modification to your existing rule to handle trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/$ /process.php\?query=$1 [QSA,NC,L]

ただし、既存のすべてのディレクトリを経由してルーティングしている場合はprocess.php、セキュリティ警告はおそらく無視できます。

于 2012-08-06T03:31:56.207 に答える
1

上記のJonLinが提供するソリューションを使用しましたが、末尾にスラッシュを追加するルールを少し変更しました。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ $1/ [L,R=301]

これにより、次のように複数のスラッシュが含まれるアドレスに対してルールが機能します。

http://example.com/path/to/page

PHPへの主な書き直しは、Jonが示したとおりです。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/$ /process.php\?query=$1 [QSA,NC,L]
于 2012-08-06T14:23:31.183 に答える