如果请求自己,RewriteRule不会按预期工作

时间:2016-07-26 23:46:10

标签: regex apache2

我想发球

http://172.16.0.2/container/app.html/any/path/hereapp.html这是一个现有资源。

另外,我希望index.html能够提供所有没有任何结束延伸的路径。即:http://172.16.0.2/container/path/randomly/written

这是我的规则:

Options -MultiViews

RewriteEngine On

RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]

RewriteRule ^[^.]{1}(?!<\.)[^.]{1,}$   index.html [L]

RewriteRule ^app.html$   - [L]
RewriteRule ^app.html(.*)$   app.html [L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule - [L]
  • 请求app.html投放
  • 请求index.html投放
  • 请求index.html/path/pathpath投放(index.html)
  • 请求index.html/path/pathpath.EXT有效(404)

BUT

  • 请求app.html/a/path生成404错误。

根本没有任何线索,有人能解释我为什么吗?

日志

172.16.0.1 - - [27/Jul/2016:10:44:40 +0000] [172.16.0.2/sid#7fc44d87d4c0][rid#7fc44dbd10b8/initial] (3) [perdir /var/www/html/applications/container/web/] add path info postfix: /var/www/html/applications/container/web/app.html -> /var/www/html/applications/container/web/app.html/sdf/sdf
172.16.0.1 - - [27/Jul/2016:10:44:40 +0000] [172.16.0.2/sid#7fc44d87d4c0][rid#7fc44dbd10b8/initial] (3) [perdir /var/www/html/applications/container/web/] strip per-dir prefix: /var/www/html/applications/container/web/app.html/sdf/sdf -> app.html/sdf/sdf
172.16.0.1 - - [27/Jul/2016:10:44:40 +0000] [172.16.0.2/sid#7fc44d87d4c0][rid#7fc44dbd10b8/initial] (3) [perdir /var/www/html/applications/container/web/] applying pattern '^app.html(.*)$' to uri 'app.html/sdf/sdf'
172.16.0.1 - - [27/Jul/2016:10:44:40 +0000] [172.16.0.2/sid#7fc44d87d4c0][rid#7fc44dbd10b8/initial] (2) [perdir /var/www/html/applications/container/web/] rewrite 'app.html/sdf/sdf' -> 'app.html'
172.16.0.1 - - [27/Jul/2016:10:44:40 +0000] [172.16.0.2/sid#7fc44d87d4c0][rid#7fc44dbd10b8/initial] (3) [perdir /var/www/html/applications/container/web/] add per-dir prefix: app.html -> /var/www/html/applications/container/web/app.html
172.16.0.1 - - [27/Jul/2016:10:44:40 +0000] [172.16.0.2/sid#7fc44d87d4c0][rid#7fc44dbd10b8/initial] (1) [perdir /var/www/html/applications/container/web/] initial URL equal rewritten URL: /var/www/html/applications/container/web/app.html [IGNORING REWRITE]

1 个答案:

答案 0 :(得分:0)

问题是这些规则被设置为<Directory>指令,在RewriteRule指令之前设置的先前<Directory>之后直接进入<VirtualHost>指令。 / p>

根据documentation,如果我在其中设置RewriteRule,我只能通过指定网址来重写。不过,我是通过考虑物理路径来指定的。

  

指定资源的文件系统上的位置   交付给客户。替换仅被视为a   在服务器(virtualhost)中配置规则时的文件系统路径   上下文和替换中路径的第一个组成部分是   存在于文件系统

两种解决方案:

  • 考虑URL重写
  • 将RewriteRule移到<Directory>指令之外,以便通过apache将替换视为物理路径