![使用 mod-rewrite 将动态 URL 转换为静态 URL(可能是 RewriteRule 问题)](https://linux22.com/image/798991/%E4%BD%BF%E7%94%A8%20mod-rewrite%20%E5%B0%86%E5%8A%A8%E6%80%81%20URL%20%E8%BD%AC%E6%8D%A2%E4%B8%BA%E9%9D%99%E6%80%81%20URL%EF%BC%88%E5%8F%AF%E8%83%BD%E6%98%AF%20RewriteRule%20%E9%97%AE%E9%A2%98%EF%BC%89.png)
我将网站从一个主机移动到另一个主机,在此过程中遇到了无法下载 .htaccess 文件的陷阱。
我正在尝试根据之前保存的副本(可能不起作用)重建上述 .htaccess,但我得到的只是 404 页面。换句话说,这个简单的重写规则出了问题,但我认为 mod_rewrite 工作正常,因为我不再看到“内部服务器错误 500”类型的错误,并且其他 vhost 站点在同一台机器上使用 mod_rewrite 可以正常运行。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^([^/.]+)/?$ index.php?page=$1 [L]
</IfModule>
来自我的网站的一个示例(实际的、有效的)页面:
site.com/index.php?page=tips
我的所有链接以及地址栏都应采用以下形式:
site.com/tips/
我以为我理解了这一点;它并不复杂。我根据各种网站的建议将 RewriteRule 行调整为各种组合并进行了故障排除。我在 Google 上搜索了两天,发现了一些与我正在做的事情接近的东西,但没有完全匹配。每次进行更改时,我都会重新启动服务器上的 apache 服务,转到本地计算机上的 Chrome,然后按 Ctrl+F5 清除缓存并刷新;我是否可能错过了“干净重新加载”步骤?
整个网站通过 index.php 进行,在我对正则表达式有更好的理解之前,我不打算通过进一步嵌套来使事情复杂化。任何帮助都非常感谢!
附注:我使用的是 Apache v2.2.22,似乎无法让此版本的“RewriteLogs”功能正常工作(当然,不是使用 .htaccess),否则我今天就不会发布这个新手问题了。在 2.4 中,此功能不再有效(日志记录已彻底改版),但我似乎无法在我的 OpenVZ Ubuntu 12.04 x64 服务器上使用 apt-get 升级到该功能。
答案1
最终 mod_rewrite 是不是在我的服务器上启用了。我通过将 phpinfo.php 文件放在站点目录中并检查 mod_rewrite 的“已加载模块”部分来检查这一点,结果发现 mod_rewrite 确实缺失了。
我使用 启用了 mod_rewrite sudo a2enmod rewrite
,用 再次检查了模块列表apache2ctl -M
,然后一切都开始重新正常工作。
更奇怪的是,mod_rewrite 不知何故关闭了整个服务器,而不仅仅是这些页面。考虑到我使用各自的 .htaccess 文件为其他网站提供服务,而且它们也不起作用(这就是我意识到这一点的原因),我很高兴我相对较快地发现了这一点。
我还了解到,Ubuntu 有自己的 Apache 更新审批/测试小组,他们尚未认证 Apache 2.4 补丁,而且可能还要过很长时间才会带来一些重大的变化。