Apache mod_rewrite没做任何事情(?)

时间:2010-10-31 13:33:04

标签: apache mod-rewrite

我在使用Apache的mod_rewrite时遇到了一些麻烦。我试图让它做的事情之一是隐藏我的一些实现细节,例如,用户看到URL http://www.mysite.com/login但是Apache响应http://www.mysite.com/doc_root/login.php处的页面而不是(最好不要向用户显示它是PHP文件或目录结构)。这是我在.htaccess文件中的内容:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?mysite.com*
RewriteRule ^/(\w+) /doc_root/$1.php [L]

#Redirect http://www.mysite.com to the login page
RewriteRule ^/?$ https://www.mysite.com/doc_root/login.php

但是当我转到http://www.mysite.com/login时,即使页面存在,我也会收到404错误。我显然对mod_rewrite条件和规则的工作原理没有很好的理解,所以有人可以告诉我我做错了什么吗?感谢。

2 个答案:

答案 0 :(得分:0)

从你拥有的所有东西中取出doc_root。这将为你提供你所要求的结果。但是我不确定是否需要。如果他们手动键入http://www.mysite.com/index.php,您将如何强制某人登录?

此外,如果您尝试强制所有流量使用SSL,最好使用第二个VirtualHost和Redirect而不是mod_rewrite。这些都是可能更适合ServerFault的问题

答案 1 :(得分:0)

  • 除非您的网站有许多不同的域名,并且希望mysite.com进行重写,否则您不需要RewriteCond。 (潜在的问题。除非你设置UseCanonicalName off,否则Apache喜欢使用域名。如果名称不符合预期,那么重写就不会发生。)
  • 在RewriteCond(和RewriteRule)模式中,.匹配任何字符。在它们之前添加反斜杠。 (小错误。不应该导致重写失败,但它们也会匹配像“mysite-com”这样的东西。)
  • mod_rewrite实际上是一个URL到文件名的过滤器。虽然它通常用于将URL重写为其他URL,但如果您要重写的内容是URL并且无法分辨,则有时会出现错误行为。 (特别是如果它重写的是别名,或者不会直接转换为真实的文件名。)但是,如果在规则中添加[PT]标志,它会将重写的内容视为URL并将其传递给到其他过滤器(包括将URL转换为文件名的过滤器)。
  • 你真的需要“/ doc_root”吗?应该已经使用DocumentRoot指令在Apache中设置了文档根目录,除非您在同一个域中有多个应用程序(在这种情况下它是应用程序根目录;文档,因此不应该成为URL的一部分) root不会改变。)。

更新:

  • 我刚才想到的另一件事:重写规则在.htaccess文件中的工作方式不同。 Apache喜欢剥离主要的斜杠。因此,您可能希望摆脱模式中的第一个斜杠,或者至少将其设为可选(^/?login而不是^/login)。
  • ^/?(\w+)将匹配/doc_root/login.php,并重写为/doc_root/doc_root.php。您应该在模式结束时使用$。