Htaccess的正则expression式奇怪的工作

我正在努力写入.htacess文件,将抓住urls像:

http://www.site.com/pageone.html

http://www.site.com/pagetwo.html

并将它们redirect到index.php,这样就可以将“ pageone ”和“ pagetwo ”作为GET参数。

以下是我的答案:

选项+ FollowSymlinks

AuthUserFile / dev / null

AuthGroupFile / dev / null

RewriteEngine On

RewriteOptionsinheritance

RewriteRule ^((?:。[^ /])+)。html $ index.php?page = $ 1 [L]

AddHandler php5脚本.php

这个正则expression式的问题是它捕获了一些页面,同时在其他页面上显示404错误。 而我不明白这个行为。

例如

http://www.site.com/draw.html

工作正常。 我在脚本中获取'draw'作为GET参数。

http://www.site.com/draws.html

redirect到404页面

任何人都可以解释我的htacess有什么问题吗?

ps – 我在典型的MAMPconfiguration下在本地的Apache服务器上看到这个。

RewriteRule ^((?:.[^/])+).html$ index.php?page=$1 [L] 
  • ^ =锚点在URI的开始
  • (?: =expression式扩展到组而不创build反向引用;不确定这里的目的是什么。
  • . =匹配一个字符。
  • [^/] =匹配任何不是斜杠的东西
  • + =以上全部,重复一次或多次
  • .html =必须以.html结尾
  • $ =锚定URI的结尾。

这个代码可以匹配/ab/cd/ef/foo.html,这绝不会出现在每个目录的上下文中。
不会匹配奇数长度的资源或目录,因为您明确地忽略了使用(.[^/])那些资源或目录。

既然你没有指定是否应该处理多个子目录,只要匹配你所描述的可以做得更多,更容易:

 RewriteRule ^([^/]+).html$ index.php?page=$1 [L] 

有关故障排除的进一步帮助,请参阅RewriteLog文档