Я занимаюсь разработкой веб-сайта и хочу, чтобы на нем оставался активный код и код разработки. Я думал об использовании .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 проблемы:
/live/
в URL и может копаться ....htaccess
файл для перенаправления example.com/
к v1.1/
Я бы предпочел иметь example.com/<almost anything>
идти в example.com/v1.1/
и example.com/debug/<anything>
идти в example.com/v1.2/
.
Я попытался...
RewriteRule ^$ v1.1/ [L]
и
RewriteRule ^(.*)$ v1.1/$1 [L]
но это не сработало ... (Внутренняя ошибка сервера).
Я поигрался с этим прекрасным инструментом - https://htaccess.madewithlove.be/ - кажется, мой файл htaccess отличный (хотя, очевидно, это не так)
Вы можете добиться такого поведения без каких-либо RewriteRule
s с помощью символических ссылок. Если ваш 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
к html
ln -s v1.1 html
Ваша live-версия теперь указывает на v1.1
.
Тогда символическая ссылка v1.2
внутри v1.1
так как debug
cd v1.1
ln -s ../v1.2 debug
Затем вы должны добавить какую-то защиту доступа (пароль / IP-адрес) в свою версию для разработки.
Когда вы закончите разработку и захотите перейти на новую версию, удалите обе символические ссылки и создайте новые символические ссылки на новую рабочую версию и версию для разработки.
Возможно, вам потребуется включить FollowSymLinks если эта опция отключена в вашей конфигурации Apache / .htaccess
(по умолчанию включено).
Я бы предпочел иметь
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/
. Это сделано для того, чтобы избежать цикла перезаписи после перезаписи запроса на /v1.1/...
или /v1.2/...
.
Обратите внимание, однако, что /v1.1/...
и /v1.2/...
по-прежнему доступны напрямую. Вам не обязательно перенаправлять их, если они ранее не были общедоступными (и проиндексированы / связаны третьими сторонами).
В стороне...
Redirect 301 /live$ http://blah.com/live/
На самом деле это ничего не даст. В Redirect
директива не принимает регулярное выражение в качестве второго аргумента, поэтому /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
файлы уже должны быть заблокированы конфигурацией вашего сервера, так что это может быть ненужным в любом случае.