Тут есть несколько проблем...
В каталоге .htaccess
контекст, URL-путь, соответствующий Правило перезаписи
шаблон никогда не начинается с косой черты, поэтому регулярное выражение ^/(.*):(.*)
никогда не будет совпадать, и директива ничего не делает. Итак Правило перезаписи
шаблон нужно было бы ^(.*):(.*)
- без префикса косой черты.
- Однако это регулярное выражение очень генеральный и, скорее всего, слишком много совпадает. Если вы ожидаете запрос формы
/1:1
, т.е. /<число>:<число>
затем используйте более конкретное регулярное выражение, например. ^\д+:\д+$
Поскольку вы получаете 403 Forbidden (в отличие от 404 Not Found), я предполагаю, что вы находитесь на сервере Windows. "проблема" здесь в том, что :
(двоеточия) не являются допустимыми символами в именах файлов Windows. Это проблема с .htaccess
потому что запрос сопоставляется с файловой системой до .htaccess
(и mod_rewrite) обрабатывается — в этот момент срабатывает ошибка 403. Вместо этого вам нужно будет переписать запрос в конфигурации основного сервера (или в контейнере VirtualHost), что происходит перед запрос сопоставляется с файловой системой.
Итак, что вы пытаетесь сделать... перепишите запрос, содержащий двоеточие, используя .htaccess
на сервере Windows невозможно. Вы можете сделать это в Linux (который разрешает двоеточие в именах файлов) ИЛИ в конфигурации основного сервера (сервер или же виртуальный хост контекст) в Windows, но не в .htaccess
.
При использовании mod_rewrite в сервер (или же виртуальный хост) контекст (в отличие от .htaccess
) ты делать нужен префикс косой черты (на обоих шаблон и замена струны). Например:
# В контексте "сервер" (или "виртуальный хост")
# не ".htaccess" (или раздел "<Directory>" в конфигурации сервера)
RewriteEngine включен
# Внутренне переписать "/1:1" в информацию о пути на "index.php"
Правило перезаписи ^/\d+:\d+$ /index.php$0 [L]
$0
обратная ссылка содержит полный URL-путь, захваченный Правило перезаписи
шаблон. Сюда входит префикс косой черты (при использовании в сервер контекст), поэтому косая черта опущена в замена нить.
ОБНОВИТЬ:
Я внес изменения, пожалуйста, посмотрите на мой вопрос еще раз и убедитесь, что я ввел его правильно.
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost
DocumentRoot "${INSTALL_DIR}/www"
<Directory "${INSTALL_DIR}/www/">
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride all
Order Allow,Deny
Allow from all
</Directory>
</VirtualHost>
Кажется, вы не внесли никаких изменений; хоть не в том разделе? Как упоминалось выше, эти директивы должны быть добавлены непосредственно в <VirtualHost>
контейнер (который вы разместили). Их нельзя добавить в .htaccess
файл в ОС Windows - они просто ничего не сделают, и вы получите ответ 403 Forbidden, как указано.
Сказанное выше должно быть написано так:
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost
DocumentRoot "${INSTALL_DIR}/www"
# Enable the rewrite engine in a virtualhost context
RewriteEngine On
# Internally rewrite "/1:1" to path-info on "index.php"
RewriteRule ^/\d+:\d+$ /index.php$0 [L]
<Directory "${INSTALL_DIR}/www/">
Options -Indexes -Includes +FollowSymLinks -MultiViews
AllowOverride all
Require all granted
</Directory>
</VirtualHost>
Вам нужно будет перезапустить Apache, чтобы эти изменения вступили в силу. (В отличие .htaccess
файлы, которые интерпретируются во время выполнения.)
Однако какие еще директивы у вас есть в .htaccess
и как маршрутизируются другие ваши URL-адреса? Вы разместили следующую директиву в комментариях:
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
Это направляет URL-адрес совершенно иначе, чем то, что вы запрашиваете в своем вопросе. В своем вопросе вы передаете URL-путь в качестве дополнительной информации о пути к index.php
. Однако в этой директиве вы передаете URL-адрес как часть строки запроса? Как это соотносится? Почему они разные? Очевидно, вам нужно передать URL-адрес так, как ожидает ваше «приложение MVC».