我在使用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条件和规则的工作原理没有很好的理解,所以有人可以告诉我我做错了什么吗?感谢。
答案 0 :(得分:0)
从你拥有的所有东西中取出doc_root
。这将为你提供你所要求的结果。但是我不确定是否需要。如果他们手动键入http://www.mysite.com/index.php,您将如何强制某人登录?
此外,如果您尝试强制所有流量使用SSL,最好使用第二个VirtualHost和Redirect
而不是mod_rewrite。这些都是可能更适合ServerFault的问题
答案 1 :(得分:0)
UseCanonicalName off
,否则Apache喜欢使用域名。如果名称不符合预期,那么重写就不会发生。).
匹配任何字符。在它们之前添加反斜杠。 (小错误。不应该导致重写失败,但它们也会匹配像“mysite-com”这样的东西。)DocumentRoot
指令在Apache中设置了文档根目录,除非您在同一个域中有多个应用程序(在这种情况下它是应用程序根目录;文档,因此不应该成为URL的一部分) root不会改变。)。更新:
^/?login
而不是^/login
)。^/?(\w+)
将匹配/doc_root/login.php,并重写为/doc_root/doc_root.php。您应该在模式结束时使用$。