【问题标题】:How to remove php extension and also redirect extensions to no extension form如何删除 php 扩展并将扩展重定向到无扩展表单
【发布时间】: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://stackoverflow.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]

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

【问题讨论】:

    标签: apache .htaccess mod-rewrite url-redirection


    【解决方案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老兄。
        猜你喜欢
        • 1970-01-01
        • 2021-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-22
        • 1970-01-01
        • 2015-03-14
        • 1970-01-01
        相关资源
        最近更新 更多