Назад | Перейти на главную страницу

Apache ModRewrite убирает часть из request_uri в rewriteCondition

так что в основном у меня есть ссылка в моем html domain.com/app/css/build/app-23471942834.css однако на сервере файл фактически находится в /fs/current/public/css/build/app-23471942834.css. Есть ли способ проверить, существует ли файл в RewriteCondition? Проблема в том, что мне в основном нужен /css/build/app-23471942834.css часть для проверки, без /app. Есть ли способ убрать это в состоянии?

Итак, мне нужно:

Я использую 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 существует в файловой системе.