我正在开发一个网站,我想保留网站上的现有代码和一些开发代码。我考虑使用 来.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
。
其中存在两个问题:
- 用户
/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 文件很好(但显然不是)
答案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.1
到html
ln -s v1.1 html
您的实时版本现在指向v1.1
。
然后v1.2
里面的符号链接v1.1
为debug
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>
。
order
和deny
是 Apache 2.2 指令。如果您使用的是 Apache 2.4+(可能性更大),那么您应该使用Require all denied
(旧版 Apache 2.2 指令已被弃用)。
但是,.htaccess
文件应该已经被您的服务器配置阻止,因此这可能是不必要的。