结合多个htaccess规则

时间:2017-05-25 16:39:54

标签: php .htaccess

我有一个删除.php扩展名的

 `RewriteEngine On
  ErrorDocument 403 "Page not exist"
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^([^/]+)/$ $1.php
  RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
  RewriteRule (.*)$ /$1/ [R=301,L]`

下面的htaccess规则重定向到stream.php文件:

`RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^(.*)$ /core/musicbox/stream/?tag=$1 [NC,L,QSA]`

两个规则都可以单独使用,但合并后,下面的规则不起作用。

1 个答案:

答案 0 :(得分:0)

你有两次相同的条件:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

这意味着:

  • !-f:文件%{REQUEST_FILENAME}不存在。
  • !-d:目录%{REQUEST_FILENAME}不存在。

如果两者都为真,则下一个(在第一组规则中)也为真:

RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$

然后,下一条规则将执行301重定向(R=301)并停止处理规则(L)。

RewriteRule (.*)$ /$1/ [R=301,L]

实际上,也许那里缺少^。它应该是:

RewriteRule ^(.*)$ /$1/ [R=301,L]

无论如何,这意味着不会达到第二组条件和后续规则:

RewriteRule ^(.*)$ /core/musicbox/stream/?tag=$1 [NC,L,QSA]

您可能不需要首先R=301L标记。我认为这应该是这样的:

RewriteEngine On
ErrorDocument 403 "Page not exist"
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule ^(.*)$ /$1/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /core/musicbox/stream/?tag=$1 [NC,L,QSA]