重写具体到更一般

时间:2017-06-28 21:01:59

标签: apache .htaccess mod-rewrite webserver

我想做mod_rewrite以便:

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

users/的任何请求都转到index.php?login=(whatever)

RewriteRule ^users/(.+) ?login=$1 [NE,L]

users/之外的任何其他请求都会转到同一位置。

RewriteRule ^(.+) users/?login=$1 [NE,L]

但第二部分产生500内部服务器错误

我被要求解释它,所以这里有一些例子:

  • 如果存在“domain.com/aaa/”,则转到“domain.com/aaa /”
  • 如果“domain.com/bbb/”不存在,则转到“domain.com/users/?login=bbb”
  • 如果“domain.com/ccc.html存在,则转到”domain.com/ccc.html“
  • 如果“domain.com/ddd.html不存在,则转到”domain.com/users/?login=ddd.html“
  • 同时,“domain.com/users/eee”转到“domain.com/users/?login=eee”,因为这是主要条件,第二个条件是后备或更普遍的捕获。

1 个答案:

答案 0 :(得分:1)

这应该有效。你必须重复这些条件,它们不会延续到下一个规则。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^users/(.+)$ /users/?login=$1 [NE,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ /users/?login=$1 [NE,L]

假设/users/目录确实存在。

如果您以后没有运行任何规则,则效率更高。它可以防止对现有项目进行任何处理,并避免将文件系统检查加倍。

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^users/(.+)$ /users/?login=$1 [NE,L]
RewriteRule ^(.+)$ /users/?login=$1 [NE,L]