1

私のhtdocsにこの設定があります:

htdocs
htdocs/somedir
htdocs/somedir/process.php
htdocs/somedir/.htaccess

これは .htaccess コードです:

RewriteEngine on
RewriteRule ^([^/]*)$ process.php?var=$1 [L]

私が信じているのは、このルールは apache に最も右の文字から開始し、それが遭遇しない限りそれを保存し続けるように指示する/というhttp://127.0.0.1/somedir/fooこと$1ですfoo。右?

しかし、この URL:http://127.0.0.1/somedir/fooにアクセスすると、print_r($_GET) は次のようにprocess.php出力します。

Array
(
    [var] => process.php
)

私はそれがこれを言うべきだと思っています:

Array
(
    [var] => foo
)

では、なぜ isvarの値は isprocess.phpであり、 notなのfooですか? var値を取得するようにこの書き換えルールを記述する方法はfoo?

補足:これをprocess.php&.htaccessルートまたは任意の第 2/第 3/第 4 レベルに移動しても、すべての適切な URL は同じ結果を生成します。

お気に入り:

http://127.0.0.1/foo             //process.php & .htaccess in root
http://127.0.0.1/somedir/foo     //process.php & .htaccess in htdocs/somedir
http://127.0.0.1/somedir/2nd/foo //process.php & .htaccess in htdocs/somedir/2nd

更新 01:

$_SERVER["REDIRECT_QUERY_STRING"]が に等しいことに気付きましたがvar=foo$_SERVER["QUERY_STRING"]var=process.php

4

1 に答える 1

2

一見すると、書き換えルールの正規表現にはバグがあると思います。から変更してみてください。

RewriteEngine on
RewriteRule ^([^/]*)$ process.php?var=$1 [L]

RewriteEngine on
RewriteRule ([^/]+)$ process.php?var=$1 [L]

文字列の先頭 ("^") に固定すると、文字列に "/" が含まれているため、一致する方法はありません。


ディレクトリごとのレベルで RewriteRules を使用するのは、もう少し複雑です。REQUEST_URI は予期したものではない可能性があるため、一部のルールでは予期しない結果が生じます。ただし、RewriteConditions で一致を参照すると、問題を解決できることがよくあります。この場合:

RewriteEngine on
RewriteCond %{THE_REQUEST} "([^/]+) HTTP"   
RewriteRule ^ process.php?var=%1 [L]

(ルールの「$」の代わりに「%」に注意してください)

于 2012-07-28T09:16:52.907 に答える