0

現在、私の .htaccess ファイルは次のようになっています。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule /?([A-Za-z0-9-]+)/?$ index.php?page=$1 [QSA,L]

http://site.com/aaaaaのような URL では問題なく動作しますが、 http ://site.com/aaaa/bbb のような URLでは、$_GET['page'] 変数には aaaaa/bbb ではなく bbb のみが含まれます。

ページ変数のすべてのサブディレクトリを取得する方法はありますか?

4

5 に答える 5

1

すべてをキャプチャしないのはなぜですか?

このように、私は推測します:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) temp.php?page=$1 [QSA,L]


これにより(私のスクリプトがtempフォルダーにあると考えると)、両方ともhttp://tests/temp/blahthttp://tests/temp/blah/glopにリダイレクトされemp.php$_GET['page']「何とか」または'blah/glop'.


これは一般的に、たとえば Zend Framework で行われていることです(参照については、こちらを参照してください)

于 2011-03-12T12:54:27.847 に答える
1

/最後の行に受け入れられる文字のリストに追加することをお勧めします: /?([A-Za-z0-9/-]+)/?$.

于 2011-03-12T12:51:12.727 に答える
1

この行で:

RewriteRule /?([A-Za-z0-9-]+)/?$ index.php?page=$1 [QSA,L]

^文字列全体に一致する を見逃しました。/また、文字列では、URL で一致させたいと考えています。したがって、次のようになるはずです。

RewriteRule ^/?([A-Za-z0-9-/]+)/?$ index.php?page=$1 [QSA,L]

逃す^と、最後の貪欲な試合が行われます。

于 2011-03-12T12:53:21.663 に答える
0

これらの範囲の文字を使用している理由はありますか?

使用しない理由:

RewriteRule ^(.*)$ index.php?page=$1

また、このようなものを使用すると、「ページ」GET変数を見逃す可能性があるという危険があります。どちらが優先されるかはわかりませんが、どちらも悪い動作です。

私が見たこの動作の例では、パスを GET パラメーターとして渡すのではなく、php を使用してパスを抽出します。$_SERVER['REQUEST_URI')

于 2011-03-12T12:56:19.120 に答える
0

[A-Za-z0-9-]パス セグメント内の文字のみを許可する場合は、これを試してください。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([A-Za-z0-9-]+(/[A-Za-z0-9-]+)*)/?$ index.php?page=$1 [QSA,L]

ところで、末尾のスラッシュの有無にかかわらず、1 つのスペルを選択し、それが他の形式の場合はリダイレクトする必要があります。

于 2011-03-12T13:39:55.520 に答える