使用 .htaccess 进行版本控制

使用 .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.1example.com/debug让我使用其中的代码v1.2

其中存在两个问题:

  1. 用户/live/在 URL 中看到该单词并可能会去挖掘......
  2. 我无法让.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 文件很好(但显然不是)

答案1

您可以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.1html

ln -s v1.1 html

您的实时版本现在指向v1.1

然后v1.2里面的符号链接v1.1debug

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

然后,您应该向开发版本添加某种访问保护(密码/ IP 地址)。

当您完成开发并想要切换到新版本时,请删除两个符号链接并创建指向新的实时版本和开发版本的新符号链接。

您可能需要启用关注符号链接如果您的 Apache 配置中禁用此选项/ .htaccess(默认启用)。

答案2

我宁愿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/...将重复重写。当达到内部重定向限制(默认 10 次循环)时,这将表现为返回给客户端的 HTTP 500(内部服务器错误)响应。请参阅服务器的错误日志以了解错误的详细信息。

就其本身而言,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>

orderdeny是 A​​pache 2.2 指令。如果您使用的是 Apache 2.4+(可能性更大),那么您应该使用Require all denied(旧版 Apache 2.2 指令已被弃用)。

但是,.htaccess文件应该已经被您的服务器配置阻止,因此这可能是不必要的。

相关内容