0

我的 .htaccess 中有以下代码:

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

RewriteRule ^/?([^/\.]+)/?$ $1.php [L]工作正常。这样做的目的是获取一个类似 urlhttp://www.example.com/whatever并将页面读取为http://www.example.com/whatever.php.

但是,我想要做的是获取一个类似的 urlhttp://www.example.com/whatever.php并自动将其发送到http://www.example.com/whatever,因此是代码的第二行。但是,这是行不通的。它现在所做的是,一旦遇到以 结尾的链接.php,url 就会变成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输入到 URL 栏中,它将自动重定向到http://www.example.com/whatever

这有任何意义吗?

编辑

好的,所以看起来我不太清楚.. 基本上,我想在 URL 仍然保持不变的情况/whatever/下阅读,对吗?但是,如果 URL 是,我希望它实际上将用户 URL重定向到,然后再次将其读取为。这可能吗?whatever.php/whatever//whatever.php/whatever/whatever.php

4

2 回答 2

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 获取URIwhatever /并应用第一条规则,然后 URI 被重写为/whatever.php
  4. URI 再次通过重写引擎
  5. URI /whatever.php匹配第二条规则并将浏览器重定向到“http://www.example.com/whatever/”
  6. 重复步骤 3-5

您需要添加一个条件,即实际请求是针对/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]
于 2012-03-09T05:32:03.737 回答
0

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

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

于 2012-03-09T05:53:23.330 回答