Php 使用htaccess删除特定页面的文件扩展名

Php 使用htaccess删除特定页面的文件扩展名,php,apache,.htaccess,mod-rewrite,Php,Apache,.htaccess,Mod Rewrite,我正在尝试仅删除我网站上特定文件的文件扩展名(在本例中为.php)。我希望当有人访问该页面的链接时,该页面不带扩展名 例如,我希望www.mysite.com/calendar.php显示为www.mysite.com/calendar,而访问主页将保持为www.mysite.com/index.php 问题是,我只希望它适用于站点上的特定页面,而不是整个站点 我尝试了一些我发现的变体(一些在这里,一些来自外部站点),但似乎没有一个能正常工作 这个例子: Options -MultiViews

我正在尝试仅删除我网站上特定文件的文件扩展名(在本例中为.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)的情况下,似乎不会强制页面转到url。然而,只要访问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_重定向错误,因为它似乎是循环的

我觉得我很接近了,但不能让它正常工作。理想情况下,我希望能够为网站上的少数页面做到这一点

编辑

正如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]

现在它工作得很好

将我的评论翻译成答案,以便帮助面临类似问题的人

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

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

Options -MultiViews
RewriteEngine On

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

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

将我的评论翻译成答案,以便帮助面临类似问题的人

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

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

Options -MultiViews
RewriteEngine On

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

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

试试:
RewriteCond%{THE_REQUEST}/(calendar)\.php[\s?][NC]
@anubhava工作得很好!谢谢试试:
RewriteCond%{THE_REQUEST}/(calendar)\.php[\s?][NC]
@anubhava工作得很好!谢谢