这些规则:
RewriteEngine On
RewriteRule ^([^/]*)$ /index.php?page=$1 [L]
导致内部重写循环。重写引擎遍历所有的规则,直到内部重定向已达到极限(从而导致500服务器错误)或导致URI出来的发动机的是,走进它的人一样。此外(这是一个非常重要的概念),之前是在htaccess文件发送到重写引擎规则的URI的前导斜杠被删除。所以在这里,我们有:
- 提出要求:http://domain.com/blah
- URI = /等等
- 条斜线,URI = 等等
- 等等匹配
^([^/]*)$
,规则被应用, URI = /index.php?page=blah
- 嗒嗒不等于的index.php
- 规则循环,URI = 的index.php
- 条斜线,URI = 的index.php
- 的index.php比赛
^([^/]*)$
,规则是施加的,URI = /index.php?page=index.php
- 索引不等于的index.php
- 规则循环,URI = 的index.php
- 条斜线,URI = 的index.php
- 的index.php匹配
^([^/]*)$
,施加规则,URI = 的index.php ?页=的index.php
- 指数不等于的index.php
等
对于如何处理这个问题你有几个选择。所述simples是简单地从目标移除/
:
RewriteRule ^([^/]*)$ index.php?page=$1 [L]
这将使所以在上述步骤9中,索引将等于的index.php,从而停止重写处理(前第二次得到应用)。唯一的缺点是如果你需要重定向,或者如果htaccess文件被移动,目标中的相对URI有时会被误认为文件路径而不是URL路径(apache猜测这个,有时候apache会猜测错误)。
RewriteBase/
RewriteRule ^([^/]*)$ index.php?page=$1 [L]
您还可以添加条件,使它这样的URL点到现有资源将排除得到应用这个规则:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)$ /index.php?page=$1 [L]
因此,如果这可以通过包括底座固定URI指向一个现有的文件或目录,该规则被跳过。因此,在第一次重写之后,当URI变为/index.php时,由于该文件存在,规则将第二次跳过。这也使得它在文档根目录中的图像,CSS,脚本或静态页面的请求不会通过index.php
路由。如果这不是你想要的,你也可以平出跳过如果URI已经是一个index.php文件:
RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^([^/]*)$ /index.php?page=$1 [L]
是页面本身的.html或php被告知显示为html的 – MHowey
重写规则^ ([^ /] *)$ index.php?page = $ 1 [L]删除index.php之前的“/”可能会解决您的问题。 – MHowey
我有一个驻留在http://sample.com/index.php的页面。 我通过将?page = home添加到它的末尾来将变量传递给它。 我希望能够使用http://sample.com/home。 –