Как заставить .htaccess использовать для маршрутизации, чтобы не маршрутизировать файлы .css,.js,.jpg и т.д.?

У меня есть следующий файл .htaccess в подкаталоге сайта, который позволяет мне маршрутизировать все URL-адреса в index.php, где я могу их проанализировать.

Однако, это не позволяет стандартным файлам, которые мне нужны для веб-сайта, например. css, javascript, png и т.д.

Что мне нужно изменить (я предполагаю, что в четвертой строке) разрешить эти файлы, чтобы они не перенаправлялись в index.php?

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|public|css|js|png|jpg|gif|robots\.txt)
RewriteRule ^(.*)$ index.php/params=$1 [L,QSA]
ErrorDocument 404 /index.php

Ответ 1

Что-то я заметил. Вы используете косую черту вместо вопросительного знака... перенаправление params обычно выглядит следующим образом:

RewriteRule ^(.*)$ index.php?params=$1 [L,QSA]

Это должно работать само по себе, так как любой из этих файлов * должен * быть реальными файлами.

ErrorDocument 404 /index.php    

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?params=$1 [L,QSA]

Чтобы сайт игнорировал определенные расширения, вы можете добавить условие для игнорирования дела и проверить только конец имен файлов в запросе:

RewriteEngine On

RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?params=$1 [L,QSA]

Если вы пытаетесь игнорировать папку, вы можете добавить:

RewriteEngine On

RewriteCond %{REQUEST_URI} !(public|css)
RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?params=$1 [L,QSA]

Ответ 2

Самый простой способ - явно игнорировать их в начале своих правил:

RewriteRule \.(css|js|png|jpg|gif)$ - [L]
RewriteRule ^(index\.php|robots\.txt)$ - [L]

Это позволяет не переносить их повсюду с помощью RewriteCond.

По вашему выбору убедитесь, что файл существует до этого:

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule \.(css|js|png|jpg|gif)$ - [L]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(index\.php|robots\.txt)$ - [L]

(Обратите внимание, что проверка файла создает дополнительный доступ к диску.)

Ответ 3

У вас есть правильная идея, настройка четвертой строки. ^ говорит, что различные строки соответствия должны быть в начале строки. Если вас не волнует, где какое-либо из них появляется в файле, вы можете просто удалить ^. Это позволит избежать перезаписи *.css, *.js и т.д.; но также не будет переписывать publicide.html.

Если вы хотите ограничить только суффиксы, попробуйте следующее:

RewriteCond $1 !^(index\.php|public|.*\.css|.*\.js|.*\.png|.*\.jpg|.*\.gif|robots\.txt)$

Это говорит, что нужно что-то в начале, а затем ., а затем суффикс. $ говорит, что они совпадают в конце (ничего не получается).

Я не уверен в public, поэтому я его оставил (это означает, что он абсолютно публичный, и ничего больше - возможно, не то, что вы имели в виду, но вы можете добавить * до или после, или и то, и другое).

Ответ 4

RewriteCond %{REQUEST_FILENAME} !-f должно быть достаточно.

Другой вариант - исключить определенные файлы из перезаписи. Из пакетов TYPO3:

# Stop rewrite processing, if we are in the typo3/ directory.
# For httpd.conf, use this line instead of the next one:
# RewriteRule ^/TYPO3root/(typo3/|t3lib/|fileadmin/|typo3conf/|typo3temp/|uploads/|favicon\.ico) - [L]
RewriteRule ^(typo3/|t3lib/|fileadmin/|typo3conf/|typo3temp/|uploads/|favicon\.ico) - [L]

Это правило должно появиться перед вашим фактическим переписыванием. Это должно быть

RewriteRule ^(public/|*\.css|*\.js|*\.png|*\.jpg|*\.gif|robots\.txt) - [L]

в вашем случае.