可以排除由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
答案 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。