Рейтинг:1

Как использовать Mod Rewrite для доступа к файлам, не относящимся к корневой папке документа?

флаг tr

У меня есть следующая структура для кодов моего веб-сайта в /var/www/html

-- файлы
---- test.txt

-- приложение
---- Некоторые PhpCodes.php
---- Некоторые PhpCodes.php

-- публичный
---- index.php
---- .htaccess

Корень документа установлен как «/var/www/html/public», но я также хочу, чтобы файлы были доступны по пути «http://mywebsite/files/test.txt».

Я думаю, что это должно быть возможно с помощью mod_rewrite в .htaccess файл внутри публичный но я изо всех сил пытаюсь это сделать.

Я попытался добавить правило по умолчанию .htaccess это обеспечивается фреймворком Laravel. Электрический ток .htaccess выглядит следующим образом:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # The following rule is added by me
    RewriteRule files/(.*\.txt) /var/www/html/files/$1 [L]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Текущий результат Внутренняя ошибка сервера при попытке доступа к «http://mywebsite/files/test.txt». У меня есть ощущение, что я мог пропустить некоторые настройки, чтобы сделать папку «файлы» общедоступной, но я понятия не имею, как это сделать.

Я застрял, и если кто-нибудь может мне помочь, я буду признателен.

Рейтинг:2
флаг jp

Вы можете создать символическую ссылку

ln -s /var/www/html/files /var/www/html/public/files

Тебе понадобится Опции +FollowSymLinks чтобы это работало. Обратите внимание, что этот параметр создает угрозу безопасности, поскольку разрешает доступ к файлам за пределами DocumentRoot.

В качестве альтернативы вы можете добавить Псевдоним /files /var/www/html/files на ваш Виртуальный хост настройки для этого сайта. Это более безопасный вариант, но вы не можете сделать это с .htaccess.

Рейтинг:1
флаг kz

В дополнение к ответу @AlexD...

думаю, что это должно быть возможно с помощью mod_rewrite в .htaccess файл

Это возможно с использованием mod_rewrite, но не в .htaccess. Вам нужно будет сделать это непосредственно в конфигурации основного сервера (или в контейнере VirtualHost).

В каталог (или же .htaccess) контекст, который вы можете переписать только на URL-путь. Однако в сервер (или же виртуальный хост) контекст, который вы можете переписать в URL-путь или же абсолютный путь к файловой системе.

Однако это не является причиной вашего Внутренняя ошибка сервера...

RewriteRule files/(.*\.txt) /var/www/html/files/$1 [L]

Это, скорее всего, приводит к циклу перезаписи (отсюда ответ 500 Internal Server Error), потому что незакрепленный Правило перезаписи шаблон также соответствует замена строка (относительный корневой URL-путь), поэтому переписанный URL-путь переписывается снова и снова...

В сервер контексте, вы можете написать это так:

Правило перезаписи ^/files/(.+\.txt)$ /var/www/html/files/$1 [L]

(Если вы не ожидаете, что подкаталоги /файлы каталог, то регулярное выражение следует сделать более строгим, например. ([^/]+\.txt))

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.