如果没有启用或配置mod_rewrite,Apache如何重写URL?
我正在从我的开发服务器重新设计网站。我正在使用网站部分的目录结构,但我正在考虑切换到URL重写并将相关文件放在网站的根目录中。
例如,about页面有一个名为about的子目录,其中包含index.php,当请求为http://www.example.com/about时,该子目录将被提供。我打算更改这个,以便即使请求不包含php扩展,也可以提供来自站点根目录的about.php。
在我的开发服务器上,问题是即使路径层次结构中没有.htaccess
文件,URL也已被重写。
Apache配置是Ubuntu的配置,我怀疑它是Ubuntu独有的东西,但我找不到原因。
以下是我所做的一些观察:
Include
配置文件来自其他几个目录。LogWarning
指令设置为debug。当我访问没有.php扩展名的页面时,错误日志显示带有扩展名的URL,访问日志显示没有扩展名和HTTP 200状态的URL。该页面已正确提供。.htaccess
文件,则会出现.htaccess: Invalid command 'RewriteEngine'
错误。 ...默认情况下,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" {} \;
我在搜索MultiViews选项时遇到了漏洞。我只是在寻找带有.conf或.load扩展名的文件,但是有些配置文件根本没有扩展名。 MultiViews选项由默认站点配置文件/ etc / apache2 / sites-enabled / 000-default设置。
感谢@zneak首先提供答案,尽管他在评论中做到了。感谢@regilero通过使用我习惯的语法中grep
的不同语法间接向我展示了我所遗漏的内容。
答案 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。