mod_rewrite / foo到/index.php?id=foo AND / foo / foo2到/index.php?id=foo/foo2

时间:2013-04-28 13:54:18

标签: php .htaccess mod-rewrite subdirectory clean-urls

我的mod_rewrite有问题。

我想在标题中重定向这些URI。我使用以下规则

RewriteEngine on

RewriteCond $1 !^(folders not to be redirected e.g. css|images)
RewriteCond $1 !^(.*).(file extension e.g. png|css|txt|php)

RewriteRule ^(.*)$ index.php?id=$1 [L]

只有当我将所有资源放在一个文件夹中时它才有用,否则它会告诉我:

"/foo/index.php" not found.

所以要解决这个问题,我把所有资源放在文件夹“www”

但是当我尝试从例如子文件夹加载资源时“foo”它告诉我:

The requested URL "/foo/foo2" was not found on this server.

如何从“/ foo / foo2”甚至“/ foo / foo2 / foo3”等子文件夹加载资源?

如何在文件夹中自动搜索index.php来解决问题?

1 个答案:

答案 0 :(得分:1)

我相信您可以使用以下方法来达到您想要的效果。它不会按文件扩展名进行筛选,而是检查文件是否确实存在。有一点不同的是它首先在你的链接上添加一个斜杠,这是你可能不想要的。

RewriteEngine on
RewriteBase /

# This appends a trailing slash. You will have to update http://so with your domain.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://so/$1/ [L,R=301]

# This does the internal redirect
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/$ /index.php?id=$1 [L]

如果您不想使用拖尾斜杠,可以使用以下

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?id=$1 [L]