Использование .htaccess для управления версиями

Я занимаюсь разработкой веб-сайта, и я хочу сохранить на нем действующий и некоторый код разработки. Я думал использовать .htaccess , чтобы я мог разработать новый код, а затем перейти к новой версии, когда она будет готова. Это глупая идея? и что не так с моим .htaccess ?

Итак, у меня есть каталоги v1.1 и v1.2 в моем корневом веб-каталоге. и это мой файл .htaccess :

#########################

RewriteEngine On

RewriteRule ^live/(.*)$     v1.1/$1 [L]
Redirect 301 /live$ http://blah.com/live/

RewriteRule ^debug/(.*)$    v1.2/$1 [L]

# Disable directory browsing
Options All -Indexes

# Deny access to all .htaccess files
<files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</files>

У меня это работает, и он позволяет example.com/live/ отображать код из v1. 1 и example.com/debug , чтобы я мог поиграть с кодом из v1.2 .

Есть 2 проблемы с этим:

  1. Пользователь видит слово / live / в URL-адресе и, возможно, копаемся ...
  2. Я не могу получить файл .htaccess для перенаправления example.com/ на v1.1 /

Я бы предпочел иметь example.com/ <почти все> , чтобы перейти на example.com/v1.1/
и example.com/debug/ , чтобы перейти на example.com/v1.2/ .

Я пробовал ...

RewriteRule ^$     v1.1/ [L]

и

RewriteRule ^(.*)$ v1.1/$1 [L]

, но они сделали не работает ... (внутренняя ошибка сервера).

Я поигрался с этим отличным инструментом - https://htaccess.madewithlove.be/ - кажется, мой файл htaccess великолепен (хотя очевидно, что это не так)

1
задан 29 December 2019 в 02:39
2 ответа

Можно достигнуть этого поведения без любого RewriteRule с при помощи символьных ссылок. Если Ваш DocumentRoot точки к /var/www/html, Вы могли бы переместить свои имеющие версию каталоги v1.1 и v2.2 в /var/www

root@www:/var/www# ls -l
total 0
drwxrwsr-x 1 www-data www-data 512 Dec 28 12:30 v1.1
drwxrwsr-x 1 www-data www-data 512 Dec 28 12:31 v1.2

и символьная ссылка v1.1 к [1 110]

ln -s v1.1 html

, Ваша активная версия теперь указывает на [1 111].

Затем символьная ссылка v1.2 внутренний v1.1 как [1 114]

cd v1.1
ln -s ../v1.2 debug

необходимо затем добавить некоторую защиту доступа (пароль / IP-адрес) к версии разработки.

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

Вы, возможно, должны были бы включить FollowSymLinks, если эта опция отключена в Вашей конфигурации Apache / .htaccess (значение по умолчанию включено).

1
ответ дан 29 December 2019 в 22:46

я предпочел бы иметь example.com/<almost anything> для движения в example.com/v1.1/ и example.com/debug/<anything> для движения в example.com/v1.2/

Да, это, конечно, будет предпочтительно. (Также рассмотрите использование debug субдомен вместо этого и сохраните тот же путь URL для "живых" версий и версий "отладки".)

Попытка следующее вместо этого:

# Rewrite the "live" site
RewriteRule !^(v\d\.\d|debug)/ /v1.1%{REQUEST_URI} [L]

# Rewrite the "debug" site
RewriteRule ^debug/(.*) /v1.2/$1 [L]

RewriteRule шаблон !^(v\d\.\d|debug)/ гарантирует, чтобы мы не переписывали запросы, которые уже запускаются /vN.N/ (где N цифра 0-9), или те, которые запускаются /debug/. Это должно избежать переписать цикла после перезаписи запроса к [1 114] или /v1.2/....

Примечание, однако, что /v1.1/... и /v1.2/... все еще непосредственно доступны. Необходимо не обязательно перенаправить их, если они ранее не были публично доступны (и индексировали / связанный с третьими лицами).

<час>

В стороне...

Redirect 301 /live$ http://blah.com/live/

Это ничего на самом деле не сделает. Redirect директива не берет regex в качестве своего второго аргумента, таким образом /live$ никогда не будет соответствовать (если, возможно, у Вас нет литерала $ в Вашем URL).

Примечание также, что Redirect mod_alias директива. RewriteRule mod_rewrite. Необходимо постараться не смешиваться, перенаправляет/переписывает от обоих модулей, поскольку можно получить неожиданные результаты. (Различные модули, выполненные в разное время всюду по запросу, не обязательно в порядке директив в Вашем файле конфигурации. На Apache mod_rewrite работает сначала.)

RewriteRule ^(.*)$ v1.1/$1 [L]

Это приведет к внутреннему, переписывают цикл, как v1.1/... будет неоднократно переписываться. Это проявляется как HTTP 500 (Внутренняя Ошибка Сервера) ответ, возвращенный клиенту, когда внутренний предел перенаправления достигнут (значение по умолчанию 10 циклов). См. журнал ошибок своего сервера для деталей ошибки.

Отдельно, RewriteRule ^$ v1.1/ [L] не должен был приводить к такой ошибке.

# Deny access to all .htaccess files
<files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</files>

Это действительно больше, чем блокируется .htaccess файлы, поскольку это также соответствует файлам формы <anything>.hta<anything>.

order и deny директивы Apache 2.2. Если Вы находитесь на Apache 2.4 + (который более вероятен), затем, необходимо использовать Require all denied вместо этого (более старые директивы Apache 2.2 удерживаются от использования).

Однако .htaccess файлы должны уже быть заблокированы Вашей конфигурацией сервера, таким образом, это может быть ненужным так или иначе.

0
ответ дан 29 December 2019 в 22:46

Теги

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