Как заставить .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]
в вашем случае.