У меня есть простой .htaccessfile
DirectoryIndex index.php
RewriteEngine On
RewriteRule ^v4r.info/(.*)/(.*) v4r.info/NGOplus/index.php?NGO=$1&page=$2 [L,QSA]
Я проверил файл в htaccess.madewithlove.com, он дает правильный результат, а копирование и вставка результата работает безупречно. (http://localhost/v4r.info/NGOplus/index.php?NGO=action-for-woman&page=board.list.php&ff=710;;;;;&startdate=2017-11-11)
Но htaccess не работает на локальном хосте с ошибкой:
File does not exist:
/var/www/html/public_html/v4r.info/action-for-woman/board.list.php
Тестовый URL-адрес
localhost/v4r.info/NGOplus/index.php?NGO=action-for-woman&page=board.list.php&ff=710;;;;;&startdate=2017-11-11
htaccess активен. (мусорная строка дает "внутренняя ошибка сервера")
в другом каталоге htaccess работает нормально.
apache.conf выглядит нормально (AllowOverride All)
Добавлен:
Файл htaccess находится не в базовом каталоге, а в подкаталоге 1. (v4r.info).
Что работает, так это htaccess в v4r.info/NGOplus с символической ссылкой «action-for-woman» на NGOplus. Правило перезаписи ^(.+?)/?$ index.php?page=$1 [L,QSA]
Здесь apache выполняет «локальную» перезапись, то есть только последнюю часть URL-адреса (имя каталога «action-for-woman» я должен извлечь из $_SERVER...)
Я думаю, это признак того, что apache не перезаписывает. Но в любом случае переписывание не рекурсивно.
мой файл .htaccess находится в каталоге v4r.info, который не является корневым каталогом.
my .htaccess file is in v4r.info directory what is not the root directory.
В этом случае ваше правило никогда не будет совпадать. RewriteRule
шаблон соответствует URL-пути относительно каталога, содержащего файл .htaccess
.
But anyhow, rewriting is not recursive afaik.
Да, это «рекурсивно» в контексте каталог (т.е. .htaccess
). В том, что механизм перезаписи «зацикливается» многократно, пока URL-адрес не пройдет без изменений или вы явно не установите END
(Apache 2.4).
Вместо этого попробуйте следующее:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !index\.php$
RewriteRule ^([^/]+)/([^/]+)$ /v4r.info/NGOplus/index.php?NGO=$1&page=$2 [L,QSA]
Проверка переменной среды REDIRECT_STATUS
заключается в том, чтобы убедиться, что перезаписываются только прямые запросы, а не уже перезаписанные запросы.
Однако этот шаблон слишком общий, поскольку он соответствует любым двум сегментам пути. Я поставил второе условие, которое проверяет index.php
, чтобы вы могли запросить /v4r.info/NGOplus/index.php
напрямую (как вы делали в своих тестах). Однако этого можно избежать, сделав регулярное выражение более конкретным.
Это не сработало, пока я не удалил каталог символической ссылки «действие для женщины» (указывающий на NGOplus). Но после удаления этой ссылки все работает
Что кажется странным: <dir>/<file> не работает, когда dir является символической ссылкой, указывающей на NGOplus. dir, являющийся пустым каталогом, не препятствует перезаписи.
«Тестовый URL-адрес…» — вы не имеете в виду, что тестовый URL-адрес
localhost/v4r.info/action-for-woman/board.list.php?ff=710;;;;;&startdate=2017-11-11
? Потенциальная проблема с опубликованным вами правилом заключается в том, что оно будет перезаписывать себя (хотя в данном случае это не должно быть проблемой), а также будет проблемой при прямом запросе целевого URL-адреса (но вы говорите, что это не так).