.htaccess RewriteRule добавляет путь к диску в URL

#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]
  

Теперь к проблеме; если я перейду к

http://localhost/project/index.php

кажется, все работает нормально. Я достигаю 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. Я так и сделаю.. (Извините за сообщение до завершения комментария)