2012-10-25 113 views
1

我试图遵循.htaccess short and friendly url的方向,但我无法实现这些结果。友好的URL的.htaccess

如果我用下面的正常工作:

RewriteEngine On 
RewriteRule ^([^/]*)\.html$ /index.php?page=$1 [L] 

但是,如果我使用:

RewriteEngine On 
RewriteRule ^([^/]*)$ /index.php?page=$1 [L] 

我收到内部服务器错误。

所有我想要实现的是能够使用http://website.com/about,而不是http://website.com/about.html

+0

是页面本身的.html或php被告知显示为html的 – MHowey

+0

重写规则^ ([^ /] *)$ index.php?page = $ 1 [L]删除index.php之前的“/”可能会解决您的问题。 – MHowey

+0

我有一个驻留在http://sample.com/index.php的页面。 我通过将?page = home添加到它的末尾来将变量传递给它。 我希望能够使用http://sample.com/home。 –

回答

2

这些规则:

RewriteEngine On 
RewriteRule ^([^/]*)$ /index.php?page=$1 [L] 

导致内部重写循环。重写引擎遍历所有的规则,直到内部重定向已达到极限(从而导致500服务器错误)或导致URI出来的发动机的是,走进它的人一样。此外(这是一个非常重要的概念),之前是在htaccess文件发送到重写引擎规则的URI的前导斜杠被删除。所以在这里,我们有:

  1. 提出要求:http://domain.com/blah
  2. URI = /等等
  3. 条斜线,URI = 等等
  4. 等等匹配^([^/]*)$,规则被应用, URI = /index.php?page=blah
  5. 嗒嗒不等于的index.php
  6. 规则循环,URI = 的index.php
  7. 条斜线,URI = 的index.php
  8. 的index.php比赛^([^/]*)$,规则是施加的,URI = /index.php?page=index.php
  9. 索引不等于的index.php
  10. 规则循环,URI = 的index.php
  11. 条斜线,URI = 的index.php
  12. 的index.php匹配^([^/]*)$,施加规则,URI = 的index.php ?页=的index.php
  13. 指数不等于的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] 
+0

林不知道为什么我没有收到电子邮件时,这是张贴。我将在今晚进行审查,以确认它能正常工作。 –

+0

然而,谢谢你,我仍然无法达到我期待的结果。 –