.htaccess mod_rewrite链接到错误的页面

时间:2012-03-09 02:46:35

标签: apache .htaccess mod-rewrite redirect clean-urls

我的.htaccess中有以下代码:

RewriteEngine On
RewriteRule ^/?([^/\.]+)/?$ $1.php [L]
RewriteRule ^/?([^/\.]+).php$ $1/ [R,L]

RewriteRule ^/?([^/\.]+)/?$ $1.php [L]工作正常。这样做的目的是获取http://www.example.com/whatever之类的网址,并将其作为http://www.example.com/whatever.php读取。

但是,我希望能够做的是使用http://www.example.com/whatever.php之类的网址并自动将其发送到http://www.example.com/whatever,因此代码的第二行。但是,这不起作用。它现在正在做的是,只要遇到以.php结尾的链接,网址就会变为http://localhost/C:/Sites/page/whatever/,并拉出403: Forbidden页面。

我想知道的是我能做到的所有内容,以便http://www.example.com/whatever.php将被视为http://www.example.com/whatever,如果将http://www.example.com/whatever.php输入到网址栏中,它会自动重定向到http://www.example.com/whatever

这有意义吗?

修改

好的,所以看起来我不太清楚..基本上,我希望/whatever/读为whatever.php,而网址仍然是/whatever/,对吧?但是,如果网址为/whatever.php,我希望它实际用户网址重定向到/whatever/,然后再次将其视为whatever.php。这可能吗?

2 个答案:

答案 0 :(得分:1)

如果你的规则在.htaccess文件中,你可以在匹配URI时省略前导斜杠:

RewriteRule ^([^/\.]+)/?$ /$1.php [L]

另请注意,目标中包含一个前导斜杠(/$1.php),这可确保 / whatever / 重写为 /whatever.php 。当您重定向时,如果您缺少此前导斜杠,则apache会将文档根目录添加到其中。因此 /whatever.php 会被重定向到文档根 C:/ Sites / page / whatever / 。即使你包含前导斜杠,这也永远不会起作用,因为你将导致重定向循环:

  1. 在地址栏中输入“http://www.example.com/whatever.php”
  2. apache将您重定向到“http://www.example.com/whatever/”
  3. apache获取URI whatever / 并应用第一条规则,并将URI重写为 /whatever.php
  4. URI再次通过重写引擎
  5. URI /whatever.php 与第二条规则匹配,并将浏览器重定向到“http://www.example.com/whatever/”
  6. 重复步骤3-5
  7. 您需要为 /whatever.php 添加实际请求的条件:

    RewriteCond %{THE_REQUEST} ^(GET|POST|HEAD)\ /([^/\.]+)\.php
    RewriteRule ^ /%2/ [R,L]
    

    总而言之,你将拥有:

    RewriteEngine On
    RewriteRule ^([^/\.]+)/?$ /$1.php [L]
    RewriteCond %{THE_REQUEST} ^(GET|POST|HEAD)\ /([^/\.]+)\.php
    RewriteRule ^ /%2/ [R,L]
    

答案 1 :(得分:0)

您在每个目录上下文中进行相对路径替换(.htaccess是每个目录的上下文)。这需要RewriteBase。当URL已映射到路径时,每个目录的重写在处理的后期完成。但重写必须生成一个URL,再次处理。我认为如果没有RewriteBase提供URL前缀,您最终会得到一个文件系统前缀而不是URL。这可能是你获得C:/Sites事情的原因。试试RewriteBase。但是在正确RewriteBase之后指定要在相对重写部分前面添加的正确URL前缀之后,我担心你会有重写循环,因为你正在重写whatever.php到{{ 1}};和whateverwhatever

参考:http://httpd.apache.org/docs/current/rewrite/tech.html