没有mod_rewrite的Apache重写?

时间:2012-01-15 22:25:43

标签: apache .htaccess mod-rewrite url-rewriting

如果没有启用或配置mod_rewrite,Apache如何重写URL?

我正在从我的开发服务器重新设计网站。我正在使用网站部分的目录结构,但我正在考虑切换到URL重写并将相关文件放在网站的根目录中。

例如,about页面有一个名为about的子目录,其中包含index.php,当请求为http://www.example.com/about时,该子目录将被提供。我打算更改这个,以便即使请求不包含php扩展,也可以提供来自站点根目录的about.php。

在我的开发服务器上,问题是即使路径层次结构中没有.htaccess文件,URL也已被重写。

Apache配置是Ubuntu的配置,我怀疑它是Ubuntu独有的东西,但我找不到原因。

以下是我所做的一些观察:

  • /etc/apache2/httpd.conf为空,但配置在/etc/apache2/apache2.conf中,而Include配置文件来自其他几个目录。
  • 此站点的层次结构中没有.htaccess文件。我检查了从/ var / www
  • 开始的每个目录
  • / etc / apache2下的.conf或.load文件除了/ etc / apache2 / mods-available中的rewrite.load文件之外,还有对重写的引用。
  • 我已将LogWarning指令设置为debug。当我访问没有.php扩展名的页面时,错误日志显示带有扩展名的URL,访问日志显示没有扩展名和HTTP 200状态的URL。该页面已正确提供。
  • 如果我添加了具有相应配置的.htaccess文件,则会出现.htaccess: Invalid command 'RewriteEngine'错误。 ...默认情况下,mod_rewrite甚至没有加载。
  • 如果我通过链接到/ etc / apache2 / mods-enabled中的加载文件来启用mod_rewrite,它会按预期工作,这就像我没有启用它一样。

access.log显示:

127.0.0.1 - - [16/Jan/2012:05:36:35 +0800] "GET /dev/ghodmode.com/h5bp/ HTTP/1.1" 200 3602 "http://alienware/dev/ghodmode.com/h5bp/experiments" "Mozilla/5.0 (Ubuntu; X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0"

,而error.log显示:

[Mon Jan 16 05:23:23 2012] [debug] mod_deflate.c(615): [client 127.0.0.1] Zlib: Compressed 5347 to 1876 : URL /dev/ghodmode.com/h5bp/experiments.php, referer: http://alienware/dev/ghodmode.com/h5bp/

如果我添加.htaccess文件:

[Mon Jan 16 05:34:33 2012] [alert] [client 127.0.0.1] /var/www/dev/ghodmode.com/h5bp/.htaccess: Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration, referer: http://alienware/dev/ghodmode.com/h5bp/experiments

更新

感谢所提供的答案,我一直在阅读,并且我学到了一些东西。它的要点是我使用的是Apache的库存Ubuntu安装,并且我没有更改默认的任何配置设置。因此,没有建议的原因。

当然,我有可能误解了一些文档。这是我第一次阅读其中一些选项。

在Multiviews
Multiviews提供了此方案的最佳解释,但这需要为路径设置类型映射或MultiViews选项。我只为'var'提供了一个类型映射(/etc/apache2/mods-enabled/mime.conf),并且只为/ usr / share / apache2 / icons设置了MultiViews选项。所以,这不可能是它。

重定向& RedirectMatch
Redirect & RedirectMatch将为此行为提供一个很好的解释,但它需要每个重定向的指令。我没有任何这些设置,我输入的任何路径服务相关的PHP文件,如果它存在。此外,如果这是原因,我认为access.log将生成3xx状态,而不是200,如果它是重定向。

Alias& AliasMatch
Alias & AliasMatch,例如Redirect& RedirectMatch需要为每个资源设置一个指令。我只为/ icons /.

设置了一个别名

FallbackResource
FallbackResource标识在请求的资源不存在时要服务的单个资源。在我的情况下,当请求的资源不存在时,它通过将“.php”附加到请求的末尾来提供找到的资源。我也进行了双重检查,并且没有设置FallbackResource指令。

以下是我用来确认某个选项未在任何地方设置的命令示例:

find /etc/apache2 -name "*.conf" -exec grep -li "FallbackResource" {} \;

更新#2:

我在搜索MultiViews选项时遇到了漏洞。我只是在寻找带有.conf或.load扩展名的文件,但是有些配置文件根本没有扩展名。 MultiViews选项由默认站点配置文件/ etc / apache2 / sites-enabled / 000-default设置。

感谢@zneak首先提供答案,尽管他在评论中做到了。感谢@regilero通过使用我习惯的语法中grep的不同语法间接向我展示了我所遗漏的内容。

1 个答案:

答案 0 :(得分:2)

你所谓的重写可以通过很多其他指令来完成:

默认情况下,这些配置文件通常不在.htaccess文件中,因为.htaccess文件只会减慢apache并允许用户添加除VirtualHosts中定义的规则之外的其他规则。最有用的配置内容在/etc/apache2/sites-enabled/etc/apaches2/mod-enableds//etc/apache2/conf.d/

现在最奇怪的是Option Multiviews制作grep -R MultiViews /etc/apache2/*。如果DocumentRoot中存在这些目录并且存在这些文件(尝试所有可用的扩展名),则此选项会将对http://www.example.com/foo/bar的任何调用映射到foo / bar.php或foo / bar.html。