.htaccess和mod_rewrite - 无法让它工作

时间:2013-06-23 00:58:14

标签: php apache .htaccess mod-rewrite

我正在尝试使用名称作为url,就像stackoverflow一样。我有一个godaddy linux主机,并使用.htaccess来控制mod_rewrite网址。

我正在努力获得以下内容:

  • / about => about.php
  • / schools / add =>附加school.php
  • / api / questions / ask => /questions.php?action=ask
  • / api / questions / 158 => /questions.php?action=get&id=158
  • / api / questions / 144 / points => /questions.php?action=get-points&id=144

这是我到目前为止所做的并且它不起作用:

## Mod rewrite manual: http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
<IfModule mod_rewrite.c>
  RewriteEngine On

  # try the corresponding php file
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ([A-Za-z0-9_-]+) $1.php [qsa]

  # special cases
  RewriteRule ^schools\/add$ add-school.php

  # API
  RewriteRule ^api\/questions\/ask$ "api.php?action=ask" [qsa]
  RewriteRule ^api\/questions\/(\d+)$ "api.php?action=get&id=$1" [qsa]
  RewriteRule ^api\/questions\/(\d+)\/points$ "api.php?action=get-points&id=$1" [qsa]

</IfModule>

2 个答案:

答案 0 :(得分:1)

所以你的第一个RewriteRule正在接管。当你去学校/添加并且文件不存在时,它会将你重定向到schools.php,这也是不存在的,所以你只需要对它们进行重新排序,当我们在它时删除转义:

## Mod rewrite manual: http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
<IfModule mod_rewrite.c>
  RewriteEngine On

  # special cases
  RewriteRule ^schools/add$ add-school.php

  # API
  RewriteRule ^api/questions/ask$ api.php?action=ask [qsa]
  RewriteRule ^api/questions/(d+)$ api.php?action=get&id=$1 [qsa]
  RewriteRule ^api/questions/(d+)/points$ api.php?action=get-points&id=$1 [qsa]


  # try the corresponding php file
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ([A-Za-z0-9_-]+) $1.php [qsa]
</IfModule>

答案 1 :(得分:1)

您的代码中几乎没有错误:

  1. 重写规则排序非常重要。您应该始终从最具体的订单到大多数通用的订购。请记住,通用的可以匹配特定规则的模式并覆盖这些特殊情况。
  2. 始终使用L(最后一个)标记规则的单个结尾。
  3. 转发请求.php您需要确保php文件确实存在。
  4. 这些建议在这里是你修改过的代码:

    Options +FollowSymLinks -MultiViews
    
    <IfModule mod_rewrite.c>
      # Turn mod_rewrite on
      RewriteEngine On
      RewriteBase /
    
      # special cases
      RewriteRule ^schools/add/?$ /add-school.php [L,NC]
    
      # API
      RewriteRule ^api/questions/ask/?$ /api.php?action=ask [L,QSA,NC]
      RewriteRule ^api/questions/(d+)/points/?$ /api.php?action=get-points&id=$1 [L,QSA,NC]
      RewriteRule ^api/questions/(d+)/?$ /api.php?action=get&id=$1 [L,QSA,NC]
    
      # try the corresponding php file if it exists
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{DOCUMENT_ROOT}/$1.php -f
      RewriteRule ^(.+?)/?$ $1.php [L]
    </IfModule>