так что в основном у меня есть ссылка в моем html domain.com/app/css/build/app-23471942834.css
однако на сервере файл фактически находится в /fs/current/public/css/build/app-23471942834.css
. Есть ли способ проверить, существует ли файл в RewriteCondition
? Проблема в том, что мне в основном нужен /css/build/app-23471942834.css
часть для проверки, без /app
. Есть ли способ убрать это в состоянии?
Итак, мне нужно:
domain.com/app/login
быть переписанным на /fs/current/public/login
domain.com/app/build/css/app-123523.css
быть переписанным на /fs/current/public/build/css/app-123523.css
domain.com/app/build/js/app-123523.js
быть переписанным на /fs/current/public/build/js/build/app-123523.css
Я использую Laravel, поэтому в моем public
каталог есть еще один .htaccess
по умолчанию с этим:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>
Извините, но файлы htaccess мне не подходят. Спасибо за вашу помощь.
Что я получил на данный момент:
RewriteCond %{HTTP_HOST} ^(www.)?domain.de$ [NC]
RewriteCond %{DOCUMENT_ROOT}/fs/current/public/$1 -f
RewriteRule ^app/(.*)$ /fs/current/public/$1 [L]
RewriteCond %{HTTP_HOST} ^(www.)?domain.de$ [NC]
RewriteRule ^app/(.*)$ /fs/current/public/index.php?/$1 [L]
РЕШЕНИЕ:
Я решил свою проблему так:
RewriteCond %{HTTP_HOST} ^(www.)?domain.de$ [NC]
RewriteCond %{REQUEST_URI} \.(css|jpg|gif|png|js|svg)
RewriteRule ^app/(.+)$ /fs/current/public/$1 [L]
Таким образом, вся перезапись применяется только к css / jpg / gif / png / js / svg. Я думаю, что проблема, с которой я столкнулся раньше, заключалась в том, что файл index.php также был переписан сценарием.
Попробуйте следующее:
RewriteEngine On
RewriteRule ^/?app/(css/build/app)-\d+(\.css)$ /fs/current/public/$1$2 [L]
Не уверен, что именно вам нужно, но это внутренне перепишет URL-адрес формы domain.com/app/css/build/app-23471942834.css
к /fs/current/public/css/build/app.css
.
Если вам нужно проверить, существует ли целевой файл перед перезаписью, вы можете добавить состояние перед RewriteRule
(хотя я не уверен, зачем вам это нужно, так как в любом случае вы получите 404). Например:
RewriteCond %{DOCUMENT_ROOT}/fs/current/public/$1$2 -f
ОБНОВЛЕНИЕ №1: Из комментариев ...
Мне нужно было бы переписать все, что не является файлом
О'кей, в этом больше смысла. Вы можете заменить указанное выше RewriteCond
директиву со следующим:
RewriteCond %{REQUEST_FILENAME} !-f
Это обработает только следующие RewriteRule
замена, если запрошенный URL сделал не сопоставить файл в файловой системе.
ОБНОВЛЕНИЕ №2: Из обновленного вопроса ...
Более общее решение после существующего RewriteEngine
директиве попробуйте следующее в .htaccess:
RewriteCond %{DOCUMENT_ROOT}/fs/current/public/$1 -f
RewriteRule ^app/(.+)$ /fs/current/public/$1 [L]
Это перезапишет запрос только в том случае, если файл формы <document-root>/fs/current/public/css/build/app-23471942834.css
или <document-root>/fs/current/public/login
существует в файловой системе.