使用.htaccess从网址中删除.php时,有些网址无法正常工作

时间:2012-03-16 13:21:07

标签: apache .htaccess mod-rewrite

我遇到了使用.htaccess文件来重写我的网址而没有.php的问题。它适用于某些地址,但不适用于其他地址。这是我的.htaccess文件中的内容..

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/]+)/$ $1.php

#rewrite url up to 3 levels
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ /$1/$2/$3.php

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]

我的网站上有以下文件夹/文件结构..

index.php
about-us
  index.php
  careers.php
our-work
  index.php
  test.php
  client1
    example.php

以下网址有效..

example.com

example.com/about-us

example.com/our-work

example.com/our-work/client1/example

但这些不起作用..

example.com/our-work/test

example.com/about-us/careers

我刚收到404错误。

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

您没有2级规则,只有1级和3级规则。你应该添加:

#rewrite url to 2 levels
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php

你应该在你的3级规则前加上RewriteCond条件:

#rewrite url to 3 levels
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ /$1/$2/$3.php

如果存在具有相同名称的目录或者PHP文件不存在,这将阻止调用规则。