如何解决为什么RewriteRule x y.php成功,但是RewriteRule x y.php / foo失败?
我正在使用现有的.htaccess文件对Web应用程序进行docker化。在安装了Apache的debian:stretch中运行应用程序时,我遇到了RewriteRules的问题。
我将其归结为一个可以在此处说明的问题:
RewriteRule ^works$ /symfony/web/json.php [QSA,L]
RewriteRule ^fails$ /symfony/web/json.php/user [QSA,L]
第一个RewriteRule
将用户发送到Symfony 1项目中的文件symfony/web/json.php
,在那里他们得到了Symfony处理的适当的404。
第二个RewriteRule
不会将用户发送到Symfony地带,通常将尾随的“ /用户”交给控制器处理。我刚得到一个“找不到文件”。
相反,看起来更深的目录中的.htaccess删除了路径的开头,并将“ / user”发送回根目录中的.htaccess。
目录结构
root/
├── symfony/
│ ├── web/
│ │ ├── .htaccess
│ │ └── json.php
│ ├── .htaccess
└── .htacces
.htaccesses
root / .htaccess (相关位):
RewriteEngine On
RewriteBase /
RewriteRule ^works$ /symfony/web/json.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /symfony/web/index.php [QSA,L]
root / symfony / .htaccess (整个):
RewriteEngine On
RewriteRule ^(.*)$ /symfony/web/$1 [L]
root / symfony / web / .htaccess (相关位):
RewriteEngine On
RewriteBase /symfony/
RewriteCond %{REQUEST_URI} ^(/symfony/admin.php)
RewriteCond %{REMOTE_ADDR} !^10\.0
RewriteCond %{REMOTE_ADDR} !^10\.50
RewriteCond %{REMOTE_ADDR} !^10\.60
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteCond %{REMOTE_ADDR} !^::1$
RewriteRule .* / [L,R=403]
# we check if the .html version is here (caching)
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
# no,so we redirect to our front web controller
RewriteRule ^(.*)$ index.php [QSA,L]
重写日志
要调试,我设置了LogLevel debug rewrite:trace3
。尝试转到/ fail时,以下是日志中的相关位:
[rewrite:trace3] [rid#7f8c7807d0a0/initial] [perdir /home/wwwroot/root/] strip per-dir prefix: /home/wwwroot/root/fails -> fails
[rewrite:trace3] [rid#7f8c7807d0a0/initial] [perdir /home/wwwroot/root/] applying pattern '^works$' to uri 'fails'
[rewrite:trace3] [rid#7f8c7807d0a0/initial] [perdir /home/wwwroot/root/] strip per-dir prefix: /home/wwwroot/root/fails -> fails
[rewrite:trace3] [rid#7f8c7807d0a0/initial] [perdir /home/wwwroot/root/] applying pattern '^fails$' to uri 'fails'
[rewrite:trace2] [rid#7f8c7807d0a0/initial] [perdir /home/wwwroot/root/] rewrite 'fails' -> '/symfony/web/json.php/user'
[rewrite:trace2] [rid#7f8c7807d0a0/initial] [perdir /home/wwwroot/root/] trying to replace prefix /home/wwwroot/root/ with /
[rewrite:trace2] [rid#7f8c7807d0a0/initial] [perdir /home/wwwroot/root/] trying to replace context docroot /home/wwwroot/root with context prefix
[rewrite:trace1] [rid#7f8c7807d0a0/initial] [perdir /home/wwwroot/root/] internal redirect with /symfony/web/json.php/user [INTERNAL REDIRECT]
[rewrite:trace3] [rid#7f8c7805c4a8/initial/redir#1] [perdir /home/wwwroot/root/symfony/web/] add path info postfix: /home/wwwroot/root/symfony/web/json.php -> /home/wwwroot/root/symfony/web/json.php/user
[rewrite:trace3] [rid#7f8c7805c4a8/initial/redir#1] [perdir /home/wwwroot/root/symfony/web/] strip per-dir prefix: /home/wwwroot/root/symfony/web/json.php/user -> json.php/user
[rewrite:trace3] [rid#7f8c7805c4a8/initial/redir#1] [perdir /home/wwwroot/root/symfony/web/] applying pattern '.*' to uri 'json.php/user'
[rewrite:trace3] [rid#7f8c7805c4a8/initial/redir#1] [perdir /home/wwwroot/root/symfony/web/] add path info postfix: /home/wwwroot/root/symfony/web/json.php -> /home/wwwroot/root/symfony/web/json.php/user
[rewrite:trace3] [rid#7f8c7805c4a8/initial/redir#1] [perdir /home/wwwroot/root/symfony/web/] strip per-dir prefix: /home/wwwroot/root/symfony/web/json.php/user -> json.php/user
[rewrite:trace3] [rid#7f8c7805c4a8/initial/redir#1] [perdir /home/wwwroot/root/symfony/web/] applying pattern '^$' to uri 'json.php/user'
[rewrite:trace3] [rid#7f8c7805c4a8/initial/redir#1] [perdir /home/wwwroot/root/symfony/web/] add path info postfix: /home/wwwroot/root/symfony/web/json.php -> /home/wwwroot/root/symfony/web/json.php/user
[rewrite:trace3] [rid#7f8c7805c4a8/initial/redir#1] [perdir /home/wwwroot/root/symfony/web/] strip per-dir prefix: /home/wwwroot/root/symfony/web/json.php/user -> json.php/user
[rewrite:trace3] [rid#7f8c7805c4a8/initial/redir#1] [perdir /home/wwwroot/root/symfony/web/] applying pattern '^([^.]+)$' to uri 'json.php/user'
[rewrite:trace3] [rid#7f8c7805c4a8/initial/redir#1] [perdir /home/wwwroot/root/symfony/web/] add path info postfix: /home/wwwroot/root/symfony/web/json.php -> /home/wwwroot/root/symfony/web/json.php/user
[rewrite:trace3] [rid#7f8c7805c4a8/initial/redir#1] [perdir /home/wwwroot/root/symfony/web/] strip per-dir prefix: /home/wwwroot/root/symfony/web/json.php/user -> json.php/user
[rewrite:trace3] [rid#7f8c7805c4a8/initial/redir#1] [perdir /home/wwwroot/root/symfony/web/] applying pattern '^(.*)$' to uri 'json.php/user'
[rewrite:trace1] [rid#7f8c7805c4a8/initial/redir#1] [perdir /home/wwwroot/root/symfony/web/] pass through /home/wwwroot/root/symfony/web/json.php
[rewrite:trace3] [rid#7f8c780830a0/subreq] [perdir /home/wwwroot/root/] strip per-dir prefix: /home/wwwroot/root/user -> user
[rewrite:trace3] [rid#7f8c780830a0/subreq] [perdir /home/wwwroot/root/] applying pattern '^works$' to uri 'user'
[rewrite:trace3] [rid#7f8c780830a0/subreq] [perdir /home/wwwroot/root/] strip per-dir prefix: /home/wwwroot/root/user -> user
[rewrite:trace3] [rid#7f8c780830a0/subreq] [perdir /home/wwwroot/root/] applying pattern '^fails$' to uri 'user'
[rewrite:trace3] [rid#7f8c780830a0/subreq] [perdir /home/wwwroot/root/] strip per-dir prefix: /home/wwwroot/root/user -> user
[rewrite:trace3] [rid#7f8c780830a0/subreq] [perdir /home/wwwroot/root/] applying pattern '^(.*)$' to uri 'user'
[rewrite:trace2] [rid#7f8c780830a0/subreq] [perdir /home/wwwroot/root/] rewrite 'user' -> '/symfony/web/index.php'
[rewrite:trace2] [rid#7f8c780830a0/subreq] [perdir /home/wwwroot/root/] trying to replace prefix /home/wwwroot/root/ with /
[rewrite:trace2] [rid#7f8c780830a0/subreq] [perdir /home/wwwroot/root/] trying to replace context docroot /home/wwwroot/root with context prefix
[rewrite:trace1] [rid#7f8c780830a0/subreq] [perdir /home/wwwroot/root/] internal redirect with /symfony/web/index.php [INTERNAL REDIRECT]
所以看起来像在根.htaccess中,RewriteRule ^fails$ /symfony/web/json.php/user
匹配并将请求重定向到symfony/web/
中的.htaccess,该匹配找到但删除了URL的开头,发送“ / user” ”恢复为原始根.htaccess。
解决方法
此问题是由Apache版本引起的。
我的Apache容器正在使用debian:stretch Docker映像,其中包括Apache 2.4.25。我将基本映像更改为debian:buster,其中包括Apache 2.4.38。该更新解决了我的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。