apache - mod_rewrite END 标志在 httpd 2.4 中不起作用

标签 apache mod-rewrite

Apache 2.4 中 mod_rewrite 的 END 标志似乎无法正常工作。我有一个名为 test 的目录,其中包含一个文件 test.html。我在目录中放置了一个 .htaccess 文件,内容如下

RewriteEngine on

RewriteRule ^test$ test.html [NC,QSA,END]
RewriteRule ^$ test.html  [NC,QSA,END]

这是请求 http://localhost.dev/test/ 的重写日志

[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a56d60/initial] [perdir /var/www/vhosts/test/] strip per-dir prefix: /var/www/vhosts/test/ -> 
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a56d60/initial] [perdir /var/www/vhosts/test/] applying pattern '^test$' to uri ''
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a56d60/initial] [perdir /var/www/vhosts/test/] strip per-dir prefix: /var/www/vhosts/test/ -> 
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a56d60/initial] [perdir /var/www/vhosts/test/] applying pattern '^$' to uri ''
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a56d60/initial] [perdir /var/www/vhosts/test/] rewrite '' -> 'test.html'
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a56d60/initial] [perdir /var/www/vhosts/test/] add per-dir prefix: test.html -> /var/www/vhosts/test/test.html
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a56d60/initial] [perdir /var/www/vhosts/test/] strip document_root prefix: /var/www/vhosts/test/test.html -> /test/test.html
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a56d60/initial] [perdir /var/www/vhosts/test/] internal redirect with /test/test.html [INTERNAL REDIRECT]
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir /var/www/vhosts/test/] strip per-dir prefix: /var/www/vhosts/test/index.php -> index.php
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir /var/www/vhosts/test/] applying pattern '^test$' to uri 'index.php'
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir /var/www/vhosts/test/] strip per-dir prefix: /var/www/vhosts/test/index.php -> index.php
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir /var/www/vhosts/test/] applying pattern '^$' to uri 'index.php'
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir /var/www/vhosts/test/] pass through /var/www/vhosts/test/index.php
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir /var/www/vhosts/test/] strip per-dir prefix: /var/www/vhosts/test/index.html -> index.html
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir /var/www/vhosts/test/] applying pattern '^test$' to uri 'index.html'
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir /var/www/vhosts/test/] strip per-dir prefix: /var/www/vhosts/test/index.html -> index.html
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir /var/www/vhosts/test/] applying pattern '^$' to uri 'index.html'
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir /var/www/vhosts/test/] pass through /var/www/vhosts/test/index.html

当第二条规则匹配请求时,为什么 mod_rewrite 对目录索引文件 index.htmlindex.php 发出子请求?

请求 http://localhost.dev/test/test正如预期的那样,无需任何子请求即可工作

[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a58b20/initial] [perdir /var/www/vhosts/test/] strip per-dir prefix: /var/www/vhosts/test/test -> test
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a58b20/initial] [perdir /var/www/vhosts/test/] applying pattern '^test$' to uri 'test'
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a58b20/initial] [perdir /var/www/vhosts/test/] rewrite 'test' -> 'test.html'
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a58b20/initial] [perdir /var/www/vhosts/test/] add per-dir prefix: test.html -> /var/www/vhosts/test/test.html
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a58b20/initial] [perdir /var/www/vhosts/test/] strip document_root prefix: /var/www/vhosts/test/test.html -> /test/test.html
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a58b20/initial] [perdir /var/www/vhosts/test/] internal redirect with /test/test.html [INTERNAL REDIRECT]

我尝试过单独或一起使用 LEND 标志。

最佳答案

看起来 mod_dir 不遵守 mod_rewrite 设置的 END 标志。对于遇到此问题的任何其他人,我能够通过以下方法解决此问题

RewriteEngine on
RewriteRule ^$ /test/home.php  [NC,QSA,END,E=IS_DIR_INDEX:1]
FallbackResource /test/fallback.php

<If "env('IS_DIR_INDEX') == 1">
    SetHandler default_handler
</If> 

关于apache - mod_rewrite END 标志在 httpd 2.4 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17895410/

相关文章:

Windows 10 上的 PHP curl,PHP 5.6.17

php - .htaccess 不适用于 Apache2

apache - 如何仅在使用 .htaccess 启用 SSL 的情况下启用目录密码保护?

php - 如何删除 codeigniter 路径中的 "index.php"

regex - 如何使 mod_rewrite 从子域重定向到查询字符串?

.htaccess - mod 重写以删除文件扩展名,添加尾部斜杠,删除 www 并在没有文件/目录可用时重定向到 404

java - HTTP 状态 404 -/xnat Apache Tomcat/8.0.26 (Ubuntu)

java - 在 Mac 上用 Eclipse 运行 tomcat

c++ - 'right clicking on the file' 是否更新其最后访问时间?

apache - 使用 mod_rewrite 维护查询字符串