单独的.htaccess文件夹,忽略前一个

时间:2017-07-02 00:03:02

标签: .htaccess mod-rewrite

我的根文件夹中有.htaccess

根:

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1&%{QUERY_STRING} [NC,L]

因此传入的GET请求来自http://www.example.com/somethingsomething而不是?page=somethingsomething。那一切都很好。

但是,在根文件夹中,我有另一个名为/i的文件夹。我喜欢这个处理另一种类型的请求,如下所示:http://www.example.com/i/somethingsomething,其结尾实际上意味着http://www.example.com/i/index.php?img=somethingsomething。问题是根文件夹中的.htaccess仍在使用中。我需要的是以下内容:

/ I:

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?img=$1&%{QUERY_STRING} [NC,L]

,但不知何故排除了根文件夹中的.htaccess

这可能吗?

编辑:

尝试在此网站上找到的内容,例如使用RewriteCond %{REQUEST_URI} !^/(i)和根.htaccess中的类似内容。

1 个答案:

答案 0 :(得分:1)

是的,您可以使用根.htaccess中的单个规则执行此操作。根.htaccess始终会被处理,因此您可以使用一条规则来执行此操作。否则它会更复杂,并且根本需要修改/i的异常。

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/(?:i/)?index\.php$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(i/)?(.*)$ /$1index.php?img=$2 [QSA,NC,L]

使用[QSA]标志,这是传递任何现有查询字符串的更好方法。不需要RewriteBase。您可能不需要目录检查,如果没有它,性能会更好。 index.php检查是为了通过在成功重写后避免另一个文件系统检查来提高性能。

<强>更新

抱歉,我没有注意到您传递给index.php的参数在第二种情况下有不同的名称。 root中的这些规则应该适合您:

RewriteEngine on

RewriteCond %{REQUEST_URI} !=/index.php
RewriteCond %{REQUEST_URI} !^/i/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?page=$1 [QSA,NC,L]

RewriteCond %{REQUEST_URI} !^/(?:i/)?index\.php$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^i/(.*)$ /i/index.php?img=$1 [QSA,NC,L]