如果没有启用或配置mod_rewrite,Apache如何重写URL?
我正在从我的开发服务器重新设计网站.我正在使用网站部分的目录结构,但我正在考虑切换到URL重写并将相关文件放在网站的根目录中.
例如,about页面有一个名为about的子目录,其中包含一个index.php,它在请求为http://www.example.com/about时提供.我打算更改它,以便即使请求不提供,也可以提供来自站点根目录的about.php包括php扩展.
在我的开发服务器上,问题是即使我在路径层次结构中的任何位置都没有.htaccess文件,URL也已被重写.
Apache配置是Ubuntu的配置,我怀疑它是Ubuntu独有的东西,但我找不到原因.
以下是我所做的一些观察:
> /etc/apache2/httpd.conf为空,但配置在/etc/apache2/apache2.conf中,后者又包含来自其他几个目录的配置文件.
>此站点的层次结构中没有.htaccess文件.我检查了从/ var / www开始的每个目录
> / etc / apache2下的.conf或.load文件除了/ etc / apache2 / mods-available中的rewrite.load文件之外,还有对重写的引用.
>我已将LogWarning指令设置为debug.当我访问没有.php扩展名的页面时,错误日志显示带有扩展名的URL,访问日志显示没有扩展名和HTTP 200状态的URL.该页面正确提供.
>如果我使用适当的配置添加.htaccess文件,我会收到.htaccess:无效命令’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,如果它是重定向.
别名& 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使用不同的语法,间接向我展示了我所缺少的内容.
最佳答案 您所谓的重写可以通过许多其他指令来完成:
> Redirect & RedirectMatch:用于外部重定向(使用301,302甚至403或404代码
> Alias & AliasMatch:用于内部重定向(例如内部目录重新映射)
> FallBackresource:将每个丢失的文件重定向到index.php boostrap
> Option Multiviews:来自mod-autoindex,默认情况下在很多安装中启用
默认情况下,这些配置文件通常不在.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.