我想将一堆文件从Apache2 VirtualHost上的DocumentRoot移动到子目录/ archive /并建立一个mod_rewrite规则,这样如果Apache没有在DocumentRoot中找到一个文件,它会在/中查找它存档/。这就是我现在所拥有的:
<VirtualHost *:80>
ServerName myserver.com
ServerAlias www.myserver.com
ServerAdmin admin@myserver.com
DocumentRoot /var/www/myserver.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine On
# Disable HTTP methods other than GET and POST
RewriteCond %{REQUEST_METHOD} !^(GET|POST)
RewriteRule .* - [R=405]
# Redirect to moved files
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/(.*)$ /archive/$1
# Force HTTPS
RewriteCond %{SERVER_NAME} =myserver.com [OR]
RewriteCond %{SERVER_NAME} =www.myserver.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
禁用HTTP请求方法和强制https工作正常的规则,但移动文件的重定向不是,我无法弄清楚原因。
这个问题与how to use rewrite, if first rewrite doesn't yield a result (search in different locations)不同,因为问题是如何编写条件来检查文件的多个目录,而我的问题是单文件夹重定向规则由于1)放置在不正确的虚拟中而无效host和2)%{REQUEST_FILENAME}没有返回文件的完整路径。 50325200的答案都没有解决或解决我遇到的问题。
答案 0 :(得分:0)
经过大量的故障排除后,我发现我遇到了两个问题:因为我还在重写所有的http流量到https,我的重写被撤消了。我将这些重写规则移到了VirtualHost for *:443,这解决了部分问题。
另一个问题是VirtualHost%{REQUEST_FILENAME}内部没有返回文件的完整路径,只返回原始URI。我必须按如下方式修改我的重写条件:
RewriteCond /var/www/myserver.com/public_html%{REQUEST_FILENAME} !-f
RewriteCond /var/www/myserver.com/public_html%{REQUEST_FILENAME} !-d
RewriteRule ^/(.*)$ /archive/$1.