Mod rewrite 修改重写和静态页面

Mod rewrite 修改重写和静态页面,mod-rewrite,Mod Rewrite,是否可以排除mod rewrite正在解析的url? my.htaccess有如下重写规则 RewriteRule ^contact contact_us.php 还有几个静态页面 目前我的网站没有问题,原因是使用 但现在我需要重写为: http://domain.com/username 我试过: RewriteRule ^(.*)$ user.php?user=$1 [L] 但是我所有的网站都停止工作了 有可能避免像contact/feed/etc这样的静态页面被当作用户名来解析吗 编

是否可以排除mod rewrite正在解析的url? my.htaccess有如下重写规则

RewriteRule ^contact contact_us.php
还有几个静态页面

目前我的网站没有问题,原因是使用 但现在我需要重写为:

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我的第一个文件:

使用
-f
-d
选项来
RewriteCond
检查当前匹配的是磁盘上的文件还是目录

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

将静态页面的重写规则放在第一位,并向其添加
[L]
标志:

RewriteRule ^contact contact_us.php [L]
...
然后,对用户名使用重写规则:

RewriteRule ^(.*)$ user.php?user=$1 [L]
(希望没有人的用户名是
联系人

编辑:根据您发布的日志输出(我假设这对应于访问
联系人
页面的失败尝试…对吗?),尝试将
联系人
重写规则更改为

RewriteRule ^contact$ contact_us.php [L]

也就是说,添加
$
使模式仅与文本URL
联系人
匹配,或者添加
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。

谢谢你的回答,但现在所有页面都像user.php一样解析。这段代码可以重写规则^user/(.*)$user.php?user=$1[L],但不是网站的基础。有没有办法告诉rewriterule不解析以前列出的静态页面?那么你是说当你访问
example.com/contact
时,
rewriterule^contact…
似乎不适用?如果是这样,那么规则的配置方式肯定有问题。如果您对问题进行编辑,使其包含
.htaccess
文件的全部内容(或至少包含其中的所有重写规则),以及文件系统中的位置和文档根目录的位置,则会有所帮助。另外(也许更好),您可以启用?酷:-)您当然也必须对
术语
注册
登录
、以及
注销
执行相同的操作。另外,如果我的答案对你有用,如果你将它标记为已接受,那就太好了。谢谢你的编辑,重写日志将非常有用。我真正想看到的是重写日志中与
http://example.com/contact
(即应重写的代码)。一种方法是删除现有日志,重新加载服务器,访问
联系人
URL,然后获取重写日志文件的内容并将其发布到paste.done!删除日志/重新加载服务器/新日志相同粘贴。太好了,请参阅我的更新答案。
RewriteRule ^(\w+)$ user.php?user=$1 [L]