Apache Mod_从根目录重写规则

Apache Mod_从根目录重写规则,apache,mod-rewrite,Apache,Mod Rewrite,这个问题困扰我有一段时间了 我已经创建了一个小型站点引擎,我正在使用mod_rewrite告诉引擎要处理哪个页面,SEO友好链接是一个额外的好处:) 这就是它今天的工作原理: 地址 变成 但我想要的是: 地址 变成 如果我为调用(/site)创建一个psuedo目录,一切都会正常工作,但当我尝试从根目录执行相同操作时,奇怪的事情开始发生 RewriteBase / RewriteRule ^site/(.*) engine.php?%{QUERY_STRING}&address=$1

这个问题困扰我有一段时间了

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

这就是它今天的工作原理:

地址 变成

但我想要的是: 地址 变成

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

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检查(已在2.4中更新,如果未使用2.2,请检查当前文档):

这将准确地向您显示mod_rewrite正在做什么,并允许您根据其输出调整配置。当心-它增长非常快,决不能用于生产环境

顺便说一句,你的文章中有一些拼写错误,值得验证一下这些错误是否与你的配置不同

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\u FILENAME}^php
是通过确保当前URL不以engine.php开头来检查您是否尚未指定引擎重写。如果要将其写入.htaccess文件而不是.httpd配置文件,则必须执行此操作。

(.*)
表示捕获任何内容。您是否尝试过在捕获所有内容之前排除文件和目录?因为如果没有它,它将导致无限递归

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ eninge.php?%{QUERY_STRING}&address=$1 [L]
官方文件中提供了更多信息:


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

重写日志,我一直在寻找类似的内容。谢谢更正了一些拼写错误:)就是这样:),是[L]标志丢失了:)。干杯。不过效果很好。我还想让www.example.com/(和www.example.com)重定向到,如果您想保留
engine.php
,只需将其添加到
DirectoryIndex
文件列表中即可。
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ eninge.php?%{QUERY_STRING}&address=$1 [L]