1

这个问题已经困扰我一段时间了。

我创建了一个小型站点引擎,我正在使用 mod_rewrite 告诉引擎要处理的页面,SEO 友好链接是一个奖励:)。

这就是它今天的工作方式:

地址http://www.example.com/site/page 变为http://www.example.com/engine.php?address=page

但我想要的是:地址http://www.example.com/page 变成http://www.example.com/engine.php?address=page

如果我为调用(/站点)创建一个伪目录,一切正常,但是当我尝试从根目录执行相同操作时,奇怪的事情开始发生。

RewriteBase /
RewriteRule ^site/(.*) engine.php?%{QUERY_STRING}&address=$1

工作正常:/site/about/contacts 变为 eninge.php?address=about/contacts

RewriteBase /
RewriteRule ^(.*)$ eninge.php?%{QUERY_STRING}&address=$1

不起作用,由于某种原因 /about/contacts 变成 eninge.php?address=eninge.php

4

3 回答 3

0

检查RewriteLog(这已在 2.4 中更新,如果不使用 2.2,请检查当前文档):

RewriteLog "/usr/local/var/apache/logs/rewrite.log"
RewriteLogLevel 3 

这将准确地向您展示mod_rewrite正在做什么,并允许您根据其输出调整您的配置。当心 - 它增长非常快,永远不应该在生产环境中使用。

顺便说一句,您的帖子中有一些拼写错误 - 值得验证这些与您的配置不同。

于 2012-04-16T14:04:53.290 回答
0
RewriteCond %{REQUEST_FILENAME} !^engine.php
RewriteRule (.*) engine.php?address=$1 [QSA,L]

尝试这个。您所拥有的是导致重写循环并首先engine.php?address=about/contacts按照您的预期执行,然后再循环并将其重写为engine.php?address=engine.php. 说得通?这[QSA,L]是一个 Query String Append 和 Last 标志,它将查询字符串添加到您的 URL 并告诉重写引擎停止寻找重写。这RewriteCond %{REQUEST_FILENAME} !^engine.php是通过确保当前 URL 不以 engine.php 开头来检查您是否尚未指定引擎重写。如果您将其写入 .htaccess 文件而不是 .httpd 配置文件,则这是必需的。

于 2012-04-16T14:12:16.173 回答
0

(.*)意思是抓住任何东西。你有没有试过在你的包罗万象之前排除文件和目录?因为没有它会导致无限递归。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ eninge.php?%{QUERY_STRING}&address=$1 [L]

更多信息可在官方文档中找到:http ://httpd.apache.org/docs/current/mod/mod_rewrite.html

更新:您还应该[L]在规则末尾指定,告诉 Apache 在这里结束重写过程。

于 2012-04-16T14:12:46.660 回答