URL重写以排除现有目录

时间:2009-08-19 23:56:32

标签: regex apache mod-rewrite url-rewriting

我正在尝试将网址从example.net/customnameexample.net/customname/重定向到example.net/my/home.php?username=customname。这本身并不复杂:

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]

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

您可以使用RewriteCond(重写条件),类似于:

RewriteCond %{REQUEST_URI} ! ^\/(about|files)\/?$
RewriteRule ^([a-zA-Z0-9_-]+)/?$ my/home.php?username=$1 [L]

如果它通过上面的所有条件,这实际上只会应用规则,类似于使用if语句。

http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond