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 . Есть ли способ удалить это в состоянии?

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

  • домен. 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 также был переписан скриптом.

1
задан 19 July 2016 в 08:44
1 ответ

Попробуйте следующее:

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

UPDATE#1: Из комментариев...

Мне нужно будет переписать все, что не является файлом

Хорошо, это имеет больше смысла. Вы можете заменить приведенную выше директиву RewriteCond на следующую:

RewriteCond %{REQUEST_FILENAME} !-f

которая будет обрабатывать следующую замену RewriteRule только в том случае, если запрошенный URL не совпадает с файлом в файловой системе.

UPDATE#2: Из обновленного вопроса...

Более общее решение, после существующей директивы RewriteEngine, попробуйте следующее в . htaccess:

RewriteCond %{DOCUMENT_ROOT}/fs/current/public/$1 -f
RewriteRule ^app/(.+)$ /fs/current/public/$1 [L]

Это перезапишет запрос только в том случае, если файл формы /fs/current/public/css/build/app-23471942834.css или /fs/current/public/login существует в файловой системе.

.
1
ответ дан 3 December 2019 в 23:43

Теги

Похожие вопросы