используя mod_rewrite для имитации нескольких подкаталогов

Мой файл .htaccess выглядит следующим образом:

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

Он отлично подходит для URL-адресов, таких как http://site.com/aaaaa, но для URL-адресов, таких как http://site.com/aaaa/bbb, переменная $ _GET ['page'] будет содержать только bbb, а не aaaaa / bbb.

Есть ли способ получить все подкаталоги в переменной страницы?

Я предлагаю добавить / в список принятых символов в вашей последней строке: /?([A-Za-z0-9/-]+)/?$ .

Почему бы просто не захватить все ?

Например, я полагаю:

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

С этим (учитывая, что мой скрипт находится во temp папке) , как http://tests/temp/blah и http://tests/temp/blah/glop перенаправляются на t emp.php , с $_GET['page'] containg 'blah' или 'blah/glop' .

Это, как правило, то, что сделано с Zend Framework, например (см. Здесь для справки) .

На этой строке:

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

Вы пропустили ^ чтобы соответствовать всей строке. Кроме того, в вашей строке вы хотите совместить / в URL-адресе. Так должно было быть:

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

Отсутствие ^ даст вам последний нескромный матч.

Есть ли причина, по которой вы используете эти диапазоны символов?

Почему бы не использовать:

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

Кроме того, опасность использует что-то вроде этого, вы можете пропустить переменную GET «page». Я не уверен, что имеет приоритет, но и плохое поведение.

Примеры, которые я видел в этом поведении, не передают путь как параметр GET, а вместо этого используют php для извлечения из $_SERVER['REQUEST_URI')

Если вы хотите разрешить только символы [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] 

Кстати: вы должны выбрать одну орфографию с косой чертой или без нее и перенаправить, если это другая форма.