2015-11-10 3 views
3

У меня есть файл структуры, как это:mod_rewrite на определенном REQUEST_URI

ROOT 
|----app/ 
|----app/init.php 
|----public/ 
|----public/index.php 
|----public/img/ 
|----public/js/ 
|----.htaccess 

.htaccess «s правила будут перенаправлять все REQUEST_URI к app/init.php

RewriteCond %{REQUEST_URI} !\.(css|js|ttf|woff|woff2|eot|otf|svg|png|jpg)$ 
RewriteCond public/%{REQUEST_FILENAME} !-f 
RewriteCond public/%{REQUEST_FILENAME} !-d 
RewriteRule ^([^?]*)$ app/init.php [NC,L,QSA] 

Тогда app/init.php будет использовать require_once, чтобы получить соответствующий .html/.php в папке public.

Это прекрасно работает; весь исключенный файл в .htaccess будет называться как таковой public/... шаблон пути в public/index.php.

Примеры:

  1. CSS <link rel="stylesheet" href="public/css/layout.css">
  2. Изображение <img src="public/img/abc.jpg" alt="">

Однако, я не хочу, чтобы добавить public/ префикс на всех файле я исключенного .htaccess

I попытался добавить

RewriteCond %{REQUEST_URI} \.(jpg)$ 
RewriteRule ^([^?]*)$ public/$1 [NC] 

Однако, это не работает. Точнее, когда я назвал это img/abc.jpg в файле public/index.php, он возвращает 500 (Internal Server Error). Я предполагаю, что это неправильно с перенаправлением, но я не уверен.

Вопрос: Как я могу позвонить css или img или т.д .. те файлы без префикса public/ в пути?

+0

я, наконец, только перенаправить '.php' в' init.php' страницы, так что я не нужно заботиться, что делают другие – andrew

ответ

0

Имейте это так в корневом .htaccess:

RewriteEngine On 

# handle css, js and img files 
RewriteRule (?:^|/)((?:img|css|js)/.+) public/$1 [L,NC] 

# handle rest of the files 
RewriteCond public/%{REQUEST_FILENAME} !-f 
RewriteCond public/%{REQUEST_FILENAME} !-d 
RewriteRule !^public/ app/init.php [L,NC] 
+0

Im достаточно новое для регулярных выражений , так что, пожалуйста, несите меня ... что делает '?:' do ?? и не будет ли флаг L при первом перезаписывании остановить переписать позже? Я отвечу на тест как можно скорее, спасибо кстати! – andrew

+0

'(?: ..)' называется ** не захватывающей группой ** в регулярном выражении. Флаг 'L' не останавливает другие правила, он просто продолжает цикл mod_rewrite. Кстати, это сработало? – anubhava

+0

Извините за поздний ответ .. с помощью «RewriteBase», он каким-то образом приводит к 404, а «RewriteRule» для css, js и img частично работает, css отображается как «Ресурс, интерпретируемый как таблица стилей, но переносимый с типом MIME text/html' – andrew

Смежные вопросы