我的.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
。这可能吗?
答案 0 :(得分:1)
如果你的规则在.htaccess文件中,你可以在匹配URI时省略前导斜杠:
RewriteRule ^([^/\.]+)/?$ /$1.php [L]
另请注意,目标中包含一个前导斜杠(/$1.php
),这可确保 / whatever / 重写为 /whatever.php 。当您重定向时,如果您缺少此前导斜杠,则apache会将文档根目录添加到其中。因此 /whatever.php 会被重定向到文档根 C:/ Sites / page / whatever / 。即使你包含前导斜杠,这也永远不会起作用,因为你将导致重定向循环:
您需要为 /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}};和whatever
到whatever
。