Я разрабатываю php-приложение, и у меня есть небольшая проблема с Apache и Mod Rewrite. Кто-нибудь знает, что здесь не так?
RewriteEngine on RewriteBase /mysite/ RewriteRule ^css\/css\.css css/css.php [L] RewriteRule ^js\/js\.js js/js.php [L] RewriteRule !^img\/.* index.php
Когда я помещаю http: //localhost/css/css.css, появляется index.php, возможно, я что-то пропустил … Почему, когда URL-адрес совпадает с первым правилом, apache не останавливает процесс перезаписи?
'last | L' (последнее правило)
- Apache не будет устанавливать заголовки для скрипта PHP
- Обработка Php против Apache RewriteRules и RegExp: какой из них быстрее?
Остановите процесс перезаписи здесь и не применяйте больше правил перезаписи. Это соответствует последней команде Perl или команде break на языке C. Используйте этот флаг, чтобы предотвратить переписывание в настоящее время переписанного URL, следуя правилам. Например, используйте его, чтобы переписать URL корневого пути ('/') на реальный, например '/ e / www /'.
Я читал форумы и документы с 3 часов, и у меня по-прежнему такая же проблема.
Заранее спасибо.
Centauro12, проблема в том, что флаг [L] фактически прекращает распространение через следующие правила, но затем (если вы находитесь в файле .htaccess), сопоставление URL начинается снова . Это означает, что все ваши правила будут обработаны во второй раз. Подробнее см. Руководство по перезаписи Apache .
Поэтому вам нужно явно отключить переписывание для перезаписанных скриптов php:
RewriteRule ^css/css.php - [L] RewriteRule ^js/js.php - [L]
или более компактный (хотя, возможно, не тот, который вам нужен):
# don't rewrite anything that really exists RewriteCond %{REQUEST_FILENAME} -f RewriteRule .* - [L]
Я нашел решение:
RewriteEngine on RewriteBase /mysite/ RewriteRule ^css\/css\.css css/css.php [L] RewriteRule ^css\/(.*)$ css/$1 [L] RewriteRule ^js\/js\.js js/js.php [L] RewriteRule ^js\/(.*)$ js/$1 [L] RewriteRule ^img/(.*)$ img/$1 [L] RewriteRule ^(.*)$ index.php?rewrite=$1
Он отлично работает, но я не знаю, почему это необходимо
RewriteRule ^css\/(.*)$ css/$1 [L]
а также
RewriteRule ^js\/(.*)$ js/$1 [L]
Надеюсь, что это все.
Благодаря! 🙂
пытаться
RewriteRule ^/css/css\.css css/css.php [L] RewriteRule ^/js/js\.js js/js.php [L] RewriteRule ! /^img/.* index.php
то есть. если вы выбрали шаблон в начале строки, запустите его с помощью /
. шаблоны сопоставляются с URL-путями , которые начинаются с /
.
РЕДАКТИРОВАТЬ
выше действителен только для конфигурации сервера, виртуального хоста и контекста каталога. если контекст является .htaccess, префикс для каждого каталога, включающий первую косую черту, удаляется до того, как правило будет согласовано (и добавлено потом), поэтому нет необходимости в ^/
здесь.
Возможно, вам придется установить свою базу перезаписи на «/» перед началом выражения с помощью «^ css …»
RewriteBase /