我正在尝试编写 .htacess 文件来捕获如下 URL:
http://www.site.com/pageone.html
http://www.site.com/pagetwo.html
并将它们重定向到 index.php,以便它会收到'第一页' 和 '第二页' 作为 GET 参数。
以下是我的 htacess:
选项 +关注符号链接
验证用户文件 /dev/null
AuthGroup文件 /dev/null
重写引擎开启
RewriteOptions 继承
重写规则 ^((?:.[^/])+).html$ index.php?page=$1 [L]
添加处理程序 php5 脚本 .php
这个正则表达式的问题在于它捕获了一些页面,而其他页面则显示 404 错误。我不明白这种行为。
例如
运行正常。我在脚本中将“draw”作为 GET 参数。
但
http://www.site.com/draws.html
重定向至 404 页面
有人能解释一下我的 htacess 出了什么问题吗?
ps - 我在典型的 MAMP 配置下的本地 Apache 服务器上看到了这一点。
答案1
RewriteRule ^((?:.[^/])+).html$ index.php?page=$1 [L]
^
= URI 开头的锚点(?:
= 将表达式扩展为组而不创建反向引用;不确定这里的目的是什么。.
= 匹配单个字符。[^/]
= 匹配任何非斜线的内容+
= 以上所有内容,重复一次或多次.html
= 必须以 .html 结尾$
= 锚定 URI 的末尾。
此代码将匹配 /ab/cd/ef/foo.html 等内容,而这永远不会出现在每个目录上下文中。
它将不是匹配奇数长度的资源或目录,因为您明确忽略了那些带有 的资源或目录(.[^/])
。
由于您没有指定是否应处理多个子目录,因此只需匹配您描述的内容就可以更轻松地完成:
RewriteRule ^([^/]+).html$ index.php?page=$1 [L]
如需进一步帮助解决问题,请参阅RewriteLog 文档