mod重写和静态页面

时间:2010-07-14 21:41:49

标签: mod-rewrite

可以排除由mod重写解析的网址吗? 我的.htaccess有重写规则,如

RewriteRule ^contact contact_us.php

以及更多静态页面。

目前我的网站没有问题导致使用http://domain.com/user.php?user=username 但现在我需要重写:

http://domain.com/username

我试过了:

RewriteRule ^(.*)$ user.php?user=$1 [L]

但我的所有网站都停止工作......

是否可以避免解析我的静态页面,例如contact / feed / etc被视为用户名?

编辑以匹配david req:

这是我实际的.htaccess文件:

RewriteEngine On
Options +Followsymlinks

RewriteRule ^contact contact_us.php [L]
RewriteRule ^terms terms_of_use.php [L]
RewriteRule ^register register.php [L]
RewriteRule ^login login.php [L]
RewriteRule ^logout logout.php [L]
RewriteRule ^posts/(.*)/(.*) viewupdates.php?username=$1&page=$2 
RewriteRule ^post(.*)/([0-9]*)$ viewupdate.php?title=$1&id=$2 
RewriteRule ^(.*)$ profile.php?username=$1 [L] 

我也启用了modrewrite log我的第一个文件:http://pastie.org/1044881

2 个答案:

答案 0 :(得分:1)

-f的{​​{1}}和-d选项检查当前匹配项是否为磁盘上的文件或目录。

RewriteCond

答案 1 :(得分:1)

首先放置静态页面的重写规则,然后将[L]标志添加到它们中:

RewriteRule ^contact contact_us.php [L]
...

然后之后,使用您的重写规则作为用户名:

RewriteRule ^(.*)$ user.php?user=$1 [L]

(希望没有人拥有contact的用户名。)

编辑:根据您发布的日志输出(我假设对应不成功尝试访问contact页面... ?),尝试将contact重写规则更改为

RewriteRule ^contact$ contact_us.php [L]

RewriteRule ^contact contact_us.php [L,NS]

即,添加$以使模式仅匹配文字网址contact,或添加NS标志以防止其应用于子请求。根据日志输出,似乎发生的事情是Apache将contact重写为contact_us.php,然后对该新URL执行内部子请求。到现在为止还挺好。奇怪的是,^contact模式再次匹配contact_us.php,将其“转换”为contact_us.php,即同样的事情,Apache将其解释为完全忽略规则的信号。现在,我想认为 Apache只会在子请求上忽略规则,但我不确定它是否忽略整个重写过程并保留原始URL,/contact,原样。如果是这种情况,做出我建议的其中一项更改应该修复它。

编辑2 :您的重写日志摘录让我想起了一些事情:我建议制作重写规则

RewriteRule ^([^/]+)$ user.php?user=$1 [L]

因为任何用户名都不应出现斜杠。 (对吧?)或者你可以做到

RewriteRule ^(\w+)$ user.php?user=$1 [L]

如果用户名只能包含单词字符(字母,数字和下划线)。基本上,创建一个正则表达式,它只匹配任何可能是有效用户名的字符序列,但不匹配图像或CSS / JS文件的URL。

相关问题