将移动文件的请求重定向到子目录

时间:2018-05-25 03:33:45

标签: mod-rewrite

我想将一堆文件从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的答案都没有解决或解决我遇到的问题。

1 个答案:

答案 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.