如何删除 php 扩展并将扩展重定向到无扩展表单

Posted

技术标签:

【中文标题】如何删除 php 扩展并将扩展重定向到无扩展表单【英文标题】:How to remove php extension and also redirect extensions to no extension form 【发布时间】:2016-01-06 09:27:11 【问题描述】:

我怎样才能在我的 htaccess 中有这个:

/page.php => redirects to /page
/page => shows the page.php
/index => redirects to root

以及如何从所有 URL 中删除尾部斜杠,特别是根 URL?

虽然我对 Apache 配置不够熟悉,但我可以找到以下代码:

# To remove .php extension
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

# To remove trailing slashes
RewriteRule ^(.*)/$ /$1 [L,R=301]

# To redirect /index to root (not sure if it works correctly)
RewriteCond %THE_REQUEST ^.*/index
RewriteRule ^(.*)index.php$ /$1 [R=301,L]

能否请您帮我解决这个场景并将其包含在一个小代码中?

谢谢


根据答案,我可以使用 .htaccess 文件中的以下代码解决问题:

# To remove .php extension
RewriteCond %THE_REQUEST ^[A-Z]3,\ (.*)\.php [NC]
RewriteRule ^ %1 [R=301,L]

# To remove trailing slash
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)/$ $1 [R=301,L]

# To check whether the file exists then set it back internally
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME.php -f
RewriteRule ^.*$ $0.php [L]

# To redirect /index to root
RewriteCond %THE_REQUEST ^.*/index
RewriteRule ^(.*)index.php$ /$1 [R=301,L]

现在,我遇到了一个新问题,即当我浏览带有斜杠的文件时,它会将我重定向到其他地方并出现 404(找不到页面)响应,如下所示:

http://domain.tld/page/ => http://domain.tld/page/home/user/public_html/domain.tld/page

另外,如果我将第二部分移到最后甚至完全删除它,服务器会向我发送 500(内部服务器错误)响应。


最后通过一些研究,我可以使用以下建议找到解决先前问题的方法:

https://***.com/a/27264788/5420319

所以,我已经更改了其中的一个代码:

# To remove trailing slash
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)/$ $1 [R=301,L]

到这里:

# To remove trailing slash
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_URI /(.*)/$
RewriteRule ^ /%1 [R=301,L]

而且不管有没有效果,我也把这部分移到了顶部。

【问题讨论】:

【参考方案1】:

已接受答案的清理和简化版本是:

# To remove trailing slash
RewriteCond %DOCUMENT_ROOT%REQUEST_FILENAME !-d
RewriteRule ^(.*)/$ $1 [R=301,L]

# To remove .php extension
RewriteRule ^(.*)\.php$ $1 [R=301,L]

# To check whether the file exists then set it back internally
RewriteCond %DOCUMENT_ROOT%REQUEST_FILENAME !-f
RewriteCond %DOCUMENT_ROOT%REQUEST_FILENAME.php -f
RewriteRule ^.*$ $0.php [L]

【讨论】:

【参考方案2】:

根据答案和我自己的研究,这将是最终答案:

# To remove trailing slash
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_URI /(.*)/$
RewriteRule ^ /%1 [R=301,L]

# To remove .php extension
RewriteCond %THE_REQUEST ^[A-Z]3,\ (.*)\.php [NC]
RewriteRule ^ %1 [R=301,L]

# To check whether the file exists then set it back internally
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME.php -f
RewriteRule ^.*$ $0.php [L]

# To redirect /index to root
RewriteCond %THE_REQUEST ^.*/index
RewriteRule ^(.*)index.php$ /$1 [R=301,L]

【讨论】:

【参考方案3】:

page.php 重定向到/page

RewriteCond %THE_REQUEST ^[A-Z]3,\ /page\.php [NC]
RewriteRule ^ /page [R=301,L]

现在,内部设置回page.php

RewriteRule ^page$ /page.php [NC,L]

删除尾部斜杠:

RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)/$ $1 [R=301,L]

现在,检查/some/page/foo 的文件是否存在/some/page/foo.php

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME.php -f
RewriteRule ^.*$ $0.php [L]

【讨论】:

您的代码存在一些问题。例如,“页面”之后的斜杠会发生内部错误,而它假设重定向到没有尾斜杠的页面。我们最后一个代码的另一个问题根本不起作用。当我浏览 page.php 时,它仍然带有扩展名,并且不会重定向到无扩展名表单。请注意,我没有放置第一个和第二个代码,因为它们特定于页面的名称,因为我需要一些东西来处理所有文件,而不仅仅是 page.php 我也尝试了您的第一个代码,但它不适用于该特定页面。它从 /page.php 重定向到 /page 但之后我从服务器收到 404 响应。 @4L3X 所有规则都按特定顺序排列,在同一个 .htaccess 文件中。 正如我之前在我的 cmets 中提到的,您能否提供一个不依赖于文件名并且不仅适用于 page.php 的所有内容的代码吗? @4L3X 在第一条规则(使用 %THE_REQUEST)中,将模式更改为:^[AZ]3,\ (.*)\.php [NC],然后,重写规则 ^ %1 [R=301,L]【参考方案4】:
Options +FollowSymLinks
RewriteEngine on
AddHandler php5.3-fastcgi php
SetEnv no-gzip dont-vary

RewriteRule ^([a-z]+)$                                                  index.php?page=$1                                   [QSA,L]
RewriteRule ^([a-z]+)/([a-z0-9]+)$                                      index.php?page=$1&subpage=$2                        [QSA,L]
RewriteRule ^([a-z]+)/([a-z0-9]+)/([a-z0-9]+)$                          index.php?page=$1&subpage=$2&module=$3              [QSA,L]
RewriteRule ^([a-z]+)/([a-z0-9]+)/([a-z0-9]+)/([a-z0-9]+)$              index.php?page=$1&subpage=$2&module=$3&submodule=$4 [QSA,L]

你可以玩这个。

【讨论】:

这实际上不会重写,会导致 500,并且不会回答问题。 这实际上,从字面上看,出乎意料地,从那以后一直在起作用,Wise Ass 先生。否则我将无法使用它,但我可以使用它并且我可以使用它。而且它运行良好,不会导致 500 并且确实很好地重写了 URL(顺便说一句。我在去年 10 月发布了答案,伙计。所以冷静,因为你现在刚刚被两次陷入泥潭)。检查队友。但它并没有准确地回答这个问题。这是我唯一能同意的。 为您工作并不能解决 OP 的问题,也不是一个好的通用解决方案。正如 OP 所要求的那样,它不会进行重定向,它可能会遇到 DPI 修复的错误,可以用一条规则替换(如果你更擅长 regexen),并且有特定于服务器的配置乱扔它。这是一个非常低质量的答案。帖子的年龄无关紧要和“检查伴侣”? WTF老兄。

以上是关于如何删除 php 扩展并将扩展重定向到无扩展表单的主要内容,如果未能解决你的问题,请参考以下文章

在 IIS7 上使用 web.config 删除 .php 扩展名

URL 重写 - 不带文件扩展名的重定向

htaccess 将 www 重定向到非 www 仍然将 .php 扩展名放在 uri 中

附加*到无扩展URL路径

动态创建 ExtJS 表单以进行页面重定向

.htaccess 重定向除 css 和 javascript 之外的所有扩展