#apache #.htaccess #mod-rewrite #apache2
#apache #.htaccess #мод-перезапись #apache2
Вопрос:
Я использую Zend Server CE (v.5.1.0), установленный на C: на компьютере с Win7. Я добавил один проект в httpd.conf, добавив:
Alias /project "D:Homepagesproject"
<Directory "D:Homepagesproject">
Options Indexes FollowSymLinks
AllowOverride all
Order allow,deny
Allow from all
</Directory>
Мой файл .htaccess в каталоге project содержит следующее:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} ^/w*.(css|js) [NC]
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
Теперь к проблеме; если я перейду к
кажется, все работает нормально. Я достигаю index.php запишите файл и получите мое содержимое. Однако, если я перехожу на любую другую страницу, которая запускает RewriteRule, кажется, что добавляется путь к каталогу. FireFox выдает следующее сообщение Не найдено:
Запрошенный URL-адрес /Homepages/project/index.php не был найден на этом сервере.
Я пытался найти аналогичный вопрос / ответ здесь, но потерпел неудачу. Есть идея? Ps. Принятие мной ответа может быть отложено, поскольку я буду отсутствовать некоторое время по поручению.
Комментарии:
1. Извините, в моем первом сообщении говорилось, что все прошло нормально при переходе на localhost / project . Это было не так. Все прошло нормально при переходе к localhost/project/index.php напрямую.
Ответ №1:
Вам необходимо установить директиву RewriteBase; в противном случае mod_rewrite автоматически и по умолчанию добавляет путь к файлу к результирующему правилу перезаписи.
От:http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
Когда происходит замена нового URL-адреса, этот модуль должен повторно ввести URL-адрес в серверную обработку. Чтобы иметь возможность сделать это, ему необходимо знать, что такое соответствующий URL-префикс или URL-база. По умолчанию этот префикс является самим соответствующим путем к файлу. Однако для большинства веб-сайтов URL-адреса напрямую не связаны с физическими путями к именам файлов, поэтому это предположение часто будет неверным! Следовательно, вы можете использовать директиву RewriteBase для указания правильного URL-префикса. Если URL-адреса вашего веб-сервера напрямую не связаны с физическими путями к файлам, вам нужно будет использовать RewriteBase в каждом файле .htaccess, где вы хотите использовать директивы RewriteRule.
Ответ №2:
Ваша последняя строка должна выглядеть так:
RewriteRule ^.*$ /index.php [NC,L]
Однако я думаю, что это бесконечный цикл, поэтому я бы предложил это правило вместо:
RewriteCond %{THE_REQUEST} !s/index.php [NC]
RewriteCond %{REQUEST_URI} !^/index.php [NC]
RewriteRule . /index.php [L]
что предотвращает переход к index.php если он уже /index.php.
Комментарии:
1. Спасибо за ответ! Однако у меня это не работает. Ваше решение, похоже, перенаправляет на localhost/index.php вместо localhost/project/index.php . Конечно, я мог бы изменить его на RewriteRule . /project/index.php [L] , но я не хочу, чтобы путь был жестко закодирован в .htaccess-файле
2. Я так и сделаю.. (Извините за сообщение до завершения комментария)