2009-08-19 110 views
1

我试图将URL从example.net/customnameexample.net/customname/重定向到example.net/my/home.php?username=customname。这本身并不复杂:URL重写以排除现有目录

RewriteRule ^([a-zA-Z0-9_-]+)$ my/home.php?username=$1 
RewriteRule ^([a-zA-Z0-9_-]+)/$ my/home.php?username=$1 

不过,我想我的排除现有的目录和文件,如example.net/about/example.net/files。我不能完全弄清楚如何使用RewriteCond(我是否需要多个重写conds?),以便排除诸如example.net/about/之类的项目被重写为example.net/home.php?username=about。我怎样才能做到这一点?

谢谢!

编辑:这里是确切的解决方案...

RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^([a-zA-Z0-9_-]+)/?$ my/home.php?url=$1 [NC,L] 
+0

关于你的编辑:你为什么使用两套完全不同的规则,其唯一的区别是单个字符?它是冗长而低效的,所以我建议使用选项限定符(问号)作为localshred,并在我们的答案中做过。 – 2009-08-20 01:40:03

+0

很对,我改变了我的回答以反映。 – Wickethewok 2009-08-20 14:00:50

回答

4

RewriteCond有出于这样的目的一些特殊的模式。试试这个:

RewriteCond %REQUEST_FILENAME ! -d 
RewriteCond %REQUEST_FILENAME ! -f 
RewriteRule ^([a-zA-Z0-9_-]+)/?$ my/home.php?username=$1 
+1

我以前见过-d和-f,但并没有意识到这就是他们所做的。谢谢!我上面发布了完整的语法正确的解决方案。 – Wickethewok 2009-08-20 00:29:53