【问题标题】:Rewrite URLs to not include file extensions重写 URL 以不包含文件扩展名
【发布时间】:2009-08-17 18:50:20
【问题描述】:

这是一个反复出现的问题。关于这个有类似的问题,但没有什么能完全回答我的问题。

我有一个网站,我希望每个页面都只能通过一个 URL 访问。它应该在所有页面上动态工作,而不是在单个硬编码文件名上。

  1. domain.tld/foo 应该重定向到 domain.tld/foo/
  2. domain.tld/foo.php 应该重定向到 domain.tld/foo/
  3. domain.tld/foo/ 应该给用户(但不要将他重定向到)domain.tld/foo.php

1 和 3 并不太难,但如果不引入循环引用并且由于重定向过多而失败,我无法计算出 2。我怎么能做到这一点?

【问题讨论】:

    标签: .htaccess mod-rewrite url-rewriting


    【解决方案1】:

    试试这三个规则:

    RewriteCond %{THE_REQUEST} ^GET\s/[^?\s]+\.php[?\s]
    RewriteRule (.+)\.php$ /$1/ [L,R=301]
    RewriteCond $0 !.+\.php$
    RewriteRule (.*[^/])$ /$1/ [L,R=301]
    RewriteRule (.+)/$ $1.php [L]
    

    若要排除任何其他现有文件,请将此规则放在其他文件之前:

    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule !.+\.php$ - [L]
    

    【讨论】:

    • 谢谢,但这会将所有 URL 重写为 foo.php/。它们都指向同一个位置,这很好,但我想摆脱.php。我还在修改它。
    【解决方案2】:

    重写 #1 由

    DirectorySlash on
    

    这应该是默认值。

    对于 #2 和 #3:

    RewriteRule /(.+).php /$1/ [R=301,L]
    RewriteRule /(.+)/ /$1.php
    

    【讨论】:

    • DirectorySlash 很好,谢谢。其余的给我无限重定向foo/bar/foo/bar.php,而foo/bar 导致foo
    • 嗯,我从这个问题中想到你想要这个用于单组件 URL。
    【解决方案3】:

    如果我的理解正确,您的问题与我在此处How can I detect if page was requested via a redirect? 发布问题时遇到的问题相似

    虽然我们无法找到完全解决问题的答案,但仍有一些回复可能对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 2011-03-24
      • 2019-04-21
      相关资源
      最近更新 更多