Использование .htaccess для перехода к родительскому каталогу последнего каталога в URL - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь написать код .htaccess, который будет игнорировать последний подкаталог URL-адреса, направлять в каталог до этого последнего подкаталога, но оставить URL-адрес нетронутым.

Это в контексте SPA, в котором я использую JavaScript для маршрутизации.

Если я перейду к каталогу xxx, который может быть произвольно глубоко вложен:

https://my-site/[subdirectories]/xxx

... затем при нажатии на относительные ссылки в каталоге xxx, например:

./aaa
./bbb
./ccc

... что будет соответствовать (и создавать URL):

https://my-site/[subdirectories]/xxx/aaa
https://my-site/[subdirectories]/xxx/bbb
https://my-site/[subdirectories]/xxx/ccc

... тогда JavaScript обнаружит изменение в URL и выведет содержимое для «виртуальных» подкаталогов aaa, bbb, ccc. Прекрасно и модно.

Однако, если я перейду к любому из этих URL-адресов напрямую, то есть, введя URL-адрес напрямую, а не используя навигацию по сайту, мой сайт выдаст ошибку 404, например aaa, bbb и ccc не являются актуальными подкаталогами. Они являются «виртуальными» подкаталогами, не соответствующими фактическим папкам на сервере, и, таким образом, выдается ошибка.

Я хочу написать подпрограмму .htaccess, которая обнаружит начальную навигацию (прямое открытие):

https://my-site/[subdirectories]/xxx/aaa
https://my-site/[subdirectories]/xxx/bbb
https://my-site/[subdirectories]/xxx/ccc

и т.д.

... и просто откройте это место:

https://my-site/[subdirectories]/xxx

... но сохраните «виртуальный» подкаталог в конце (aaa, bbb, ccc) в URL-адресе, как показано в строке URL-адреса. Мой JavaScript возьмет оттуда, чтобы ввести желаемый контент для aaa, bbb, ccc. (И это прекрасно работает после того, как сначала перейдете непосредственно к https://my-site/[subdirectories]/xxx, а затем просто нажмете на ссылки на aaa, bbb, ccc; он напрямую попадет в любую из этих «подкаталогов».)

Можно ли это сделать с помощью .htaccess? Я борюсь.

1 Ответ

0 голосов
/ 07 июля 2019

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

Если имена подкаталогов известны, и для этого примера это aaa, bbb и ccc, то следующее правило открывает файл index.html в подкаталоге, оставляя URL-адрес без изменений:

RewriteEngine on

# If it's not an actual directory...
RewriteCond %{REQUEST_FILENAME} !-d

# If it's not an actual file...
RewriteCond %{REQUEST_FILENAME} !-f

# Provided aaa, bbb, and ccc are the known subdirectories,
# and (.+) represents ANY text that follows (i.e., any deeper
# subdirectory structure), then $1/index.html will route to
# the index.html file in whichever folder of the aaa|bbb|ccc list
# that is provided: 
RewriteRule ^(aaa|bbb|ccc)/(.+)$ $1/index.html [L]
...