如何删除 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 扩展名