繁体   English   中英

没有mod_rewrite的Apache重写?

[英]Apache rewriting without mod_rewrite?

在未启用或配置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来自其他一些目录的s配置文件。
  • 在此网站的层次结构中的任何地方都没有.htaccess文件。 我已经检查了从/ var / www开始的每个目录
  • 除了/ etc / apache2 / mods-available中的rewrite.load文件之外,/ etc / apache2下的.conf或.load文件没有任何要重写的引用。
  • 我已经将LogWarning指令设置为调试。 当我访问不带.php扩展名的页面时,错误日志显示带扩展名的URL,访问日志显示不带扩展名和HTTP 200状态的URL。 该页面已正确投放。
  • 如果确实添加了具有适当配置的.htaccess文件,则会收到.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

更新资料

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

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

多视图
多视图为这种情况提供了最好的解释,但是需要为路径设置类型映射或多MultiViews选项。 我只有一个类型映射(/etc/apache2/mods-enabled/mime.conf)用于'var',而MultiViews选项仅设置用于/ usr / share / apache2 / icons。 所以,这不可能。

重定向和重定向匹配
Redirect&RedirectMatch将为这种行为提供一个很好的解释,但是它需要每个重定向的指令。 我没有任何这些设置,并且我键入的任何路径都会提供相关的php文件(如果存在)。 另外,如果这是原因,我认为access.log将生成3xx状态,而不是200(如果是重定向)。

别名和别名匹配
像Redirect和RedirectMatch一样, Alias&AliasMatch需要为每个资源设置指令。 我只为/ icons /设置了别名。

后备资源
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语法间接地向我展示了我所缺少的内容。

您所说的重写可以通过许多其他指令来完成:

默认情况下,这些配置项通常不在.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。 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM