2012-04-16 194 views
1

这个问题一直在窃听我一会儿。Mod_rewrite规则从根

我有一个创建的小型网站引擎,我使用mod_rewrite来告诉引擎要处理的页面,搜索引擎友好链接是一个奖金:)。

这是它是如何今天的作品:

的ADRESS http://www.example.com/site/page 成为http://www.example.com/engine.php?address=page

但我想要的是: 的ADRESS http://www.example.com/page 变成如果我创建一个伪http://www.example.com/engine.php?address=page

一切正常呼叫目录(/站点),但是当我尝试从根做同样的事情时,奇怪的事情开始发生。

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

正常工作:?/网站/约/触点变得eninge.php地址=约/触点

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

不行的,因为某些原因/约/触点变得eninge.php?地址= eninge.php

回答

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在这里结束重写的过程。

+0

这样做:),这是[L]国旗失踪:)。干杯。 – ztripez 2012-04-16 14:18:39

+0

工作正常,但是。我也想让www.example.com/(和www.example.com)重定向到http://www.example.com/engine.php?address=index – ztripez 2012-04-16 14:43:31

+0

nvm我将engine.php重命名为index.php 。正常工作 – ztripez 2012-04-16 15:07:02

0

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

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

这将向您显示mod_rewrite正在执行的操作,并允许您根据其输出调整配置。当心 - 它增长得非常快,不应该在生产环境中使用。

顺便说一句,你的后验证中有一些错误的验证,这些错误与你的配置有所不同。

+0

RewriteLog,我一直在寻找类似的东西。谢谢。 更正了一些错别字:) – ztripez 2012-04-16 14:07:26

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]是查询字符串追加和最后一个标志,将查询字符串添加到您的URL并告诉重写引擎停止寻找重写。 RewriteCond %{REQUEST_FILENAME} !^engine.php将通过确保当前URL不以engine.php开头来检查是否已经指定了引擎重写。如果你在.htaccess文件而不是.httpd配置文件中写这个,这是必须的。

+0

感谢QSA提示。 – ztripez 2012-04-16 14:21:11