1

私の実際の.htaccessは

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([_0-9a-zA-Z-]+)? index.php?cl=$1 [L]

そして、sub.domain.com/client1のようなものを入力するとうまくいきます(その後、phpコードで$cl変数を適切に取得します)。問題は、sub.domain.com/client1/ のような末尾のスラッシュを最後に追加すると、var に "client1/" が表示されることです!

どうすれば修正できますか?htaccess の 2 番目の条件が既存のディレクトリを検索し、書き換えルールをスキップすることはわかっていますが、サーバーに「client1」ディレクトリはありません。

4

3 に答える 3

1

「問題は、sub.domain.com / client1 /のような最後のスラッシュを追加すると、変数に「client1 /」が含まれることです!」

これが予想される動作です。その後、PHPを介してスラッシュを削除する必要があります。

$cl = trim( $_REQUEST['cl'], '/' );

または、値を展開してすべてのフォルダーを取得します(スラッシュの後に別の名前が続く場合)

$cl = explode( '/', $_REQUEST['cl'] );
于 2012-10-18T13:18:43.983 に答える
0

一致がURLパス全体を消費することを要求するだけです。

# Note the trailing $ on the pattern
RewriteRule ^([_0-9a-zA-Z-]+)?$ index.php?cl=$1 [L]

現在のところ、パターンは、リクエストパスが(オプションで)1つ以上の文字、数字、および/またはアンダースコアとダッシュ文字で始まるかどうかを確認しますが、それ以外の場合は制限されません。だからそれはa/b/c/d/e/f/g文句なしに一致するでしょう。変数にパターン以外のものを含めるべきではない$場合、追加(この場合は「文字列の終わり」を意味します)は一致を制限します。

于 2012-10-18T13:18:10.453 に答える
0

私は非常に似たようなことをしようとしていますが、これは私にとってはうまくいきます:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([^\/]+)$ index.php?arg1=$1&arg2=default [L]
RewriteRule ^([^\/]+)\/$ index.php?arg1=$1&arg2=default [L]
RewriteRule ^([^\/]+)\/([^\/]+)$ index.php?arg1=$1&arg2=$2 [L]
RewriteRule ^([^\/]+)\/([^\/]+)\/$ index.php?arg1=$1&arg2=$2 [L]

条件が見つかった場合、書き換えルールは終了するため、長い URL パスごとに徐々にチェックされます。

「_0-9a-zA-Z-」文字のみをフィルタリングする代わりに、これは「/」以外のすべての文字を許可します。これは、各引数の間でリテラル「/」を探すためです。

必要な数の引数に対してこれを拡張できます。また、このルールが受け入れる引数の数を超える URL の場合、ユーザーはルート .htaccess によって設定されたエラー 404 ページに移動する必要があります。

于 2013-03-22T09:14:28.870 に答える