【问题标题】:mod rewrite and static pagesmod重写和静态页面
【发布时间】:2010-07-14 21:41:48
【问题描述】:

是否可以排除正在被 mod rewrite 解析的 url? 我的 .htaccess 具有重写规则,例如

RewriteRule ^contact contact_us.php

还有几个静态页面。

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

http://domain.com/username

我试过了:

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

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

是否可以避免将我的静态页面(如联系人/供稿/等)解析为用户名?

编辑以匹配大卫请求:

这是我实际的 .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 记录我的第一个文件:http://pastie.org/1044881

【问题讨论】:

  • 感谢编辑,重写日志将非常有帮助。我真正想看到的是重写日志中与http://example.com/contact 的请求相对应的部分(即应该重写的部分)。一种方法是删除现有日志,重新加载服务器,访问contact URL,然后获取重写日志文件的内容并将其发布到 Pastie。
  • 完成!已删除的日志/重新加载的服务器/新的日志相同的馅饼。
  • 太好了,看看我的更新答案。

标签: mod-rewrite


【解决方案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]

也就是说,要么添加 $ 以使模式仅匹配文字 URL 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。

【讨论】:

  • 感谢您的回答,但现在所有页面都被解析为 user.php 此代码有效 RewriteRule ^user/(.*)$ user.php?user=$1 [L] 但不是基于地点。有什么想法告诉 rewriterule 不要解析以前列出的静态页面吗?
  • 所以您是说当您访问example.com/contact 时,RewriteRule ^contact ... 似乎不适用?如果是这样,那么您的规则配置方式一定有问题。如果您编辑您的问题以包含.htaccess 文件(或至少其中的所有重写规则)的整个内容,以及它在文件系统中的位置以及文档根目录。另外(也许更好),你能启用rewrite log吗?
  • 酷 :-) 当然,termsregisterloginlogout 也必须这样做。另外,如果我的回答对您有用,最好将其标记为已接受。
【解决方案2】:

RewriteCond-f-d 选项检查当前匹配是否是磁盘上的文件或目录。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-24
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多