使用htaccess

时间:2017-11-08 18:22:47

标签: php apache .htaccess mod-rewrite

我试图仅在我的网站上删除特定文件的文件扩展名(在本例中为.php)。当有人访问指向该页面的链接时,我希望在没有扩展名的情况下显示该页面。

例如,我希望www.mysite.com/calendar.php显示为www.mysite.com/calendar,访问主页时仍然可以访问www.mysite.com/index.php

问题是我只希望这适用于网站上的特定网页,而不是整个网站。

我尝试了一些我发现的变体(有些变种,有些变种来自外部网站),似乎没有任何变化。

这个例子:

Options -MultiViews
RewriteEngine On

# To externally redirect /calendar.php to /calendar
RewriteCond %{THE_REQUEST} \s/+(calendar)\.php[\s?] [NC]
RewriteRule ^ /%1 [R=302,L,NE]

# To internally forward calendar to calendar.php
RewriteRule ^(calendar)/?$ $1.php [L,NC]

似乎没有扩展名(www.mysite.com/calendar)强制页面转到网址。但是,只需访问www.mysite.com/calendar即可。

下一个例子:

Options -MultiViews
RewriteEngine On

# To externally redirect /calendar.php to /calendar
RewriteCond %{REQUEST_URI} calendar.php
RewriteRule ^(.*)$ /calendar [L,R=302,NC]

# To internally forward calendar to calendar.php
RewriteRule ^(calendar)/?$ $1.php [L,NC]

似乎可以在不使用扩展名的情况下显示url,但会导致ERR_TOO_MANY_REDIRECTS错误,因为它似乎正在循环播放。

我觉得我很接近,但不能让它正常工作。我非常希望能够在网站上的一些页面上做到这一点。

修改

正如anubhava在评论中所建议的那样,我将第一个例子更新为:

Options -MultiViews
RewriteEngine On

# To externally redirect /calendar.php to /calendar
RewriteCond %{THE_REQUEST} /(calendar)\.php[\s?] [NC]
RewriteRule ^(.*)$ /q90fm-2017/calendar [L,R=302,NC]

# To internally forward calendar to calendar.php
RewriteRule ^(calendar)/?$ $1.php [L,NC]

现在它完美无缺!

1 个答案:

答案 0 :(得分:0)

将我的评论翻译为答案,以便它可以帮助遇到类似问题的人。

问题是.htaccess位于子目录内,而不是直接位于站点根目录下。这就是123在上面的\s/+中不匹配的原因。

我建议遵循以下规则来避免硬编码子目录:

RewriteCond