【问题标题】:htaccess code to remove extension AND add+force trailing slash?htaccess 代码删除扩展名并添加+强制斜杠?
【发布时间】:2010-11-07 07:17:22
【问题描述】:

我正在尝试将一些 htaccess 代码放在一起,将 example.com/filename.php 变成 example.com/filename/(并强制使用斜杠) - 我尝试了各种方法,但每种方法都不太正确,从子文件夹上的 500 个错误到尾部斜杠的问题等等......

请帮忙!

【问题讨论】:

  • 您实际上并没有提到您尝试过的方法 - 您当前的重写规则集是什么(假设您使用的是 mod_rewrite)?如果你不使用 mod_rewrite,你在使用什么?
  • RewriteBase / RewriteRule ^()$ index.php [NC,L] Rewritecond %{REQUEST_URI} !(^/?.*\..*$) [NC] RewriteRule ^(.*) $ $1.php [NC] 目前可以很好地从文件中删除 .php 扩展名,无论文件夹深度如何。但是,添加 / 会导致 404 错误,并且所有尝试集成强制斜线解决方案的尝试都导致了问题。
  • 请接受一个答案,这个问题也与其他问题相关联。
  • @Jono Alderson 那么这里接受哪个答案?

标签: .htaccess mod-rewrite url-rewriting


【解决方案1】:

试试这个:

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

RewriteRule (.*)/$ $1.php [L]

第一条规则将/foo/bar.php的请求从外部重定向到/foo/bar/。第二条规则将 /foo/bar/ 内部的请求重写为 /foo/bar.php

要强制使用斜杠,请尝试以下规则:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .*[^/]$ $0/ [L,R=301]

【讨论】:

    【解决方案2】:

    Gumbo 的这个解决方案非常适用于文件,但它不适用于目录。 换句话说:

    对于mysite.com/file1.php,它显示mysite.com/file1/,这很棒。 然而,它不适用于目录。如果我尝试访问以下目录(其中包含 index.php 文件)mysite.com/dir1,而不是显示 http:/mysite.com/dir1/index.php 的内容和 url:mysite.com/dir1/,它返回 404。

    我的解决方案是:

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

    换句话说,如果它是一个目录,就不做任何事情。

    希望对你有帮助。

    原始解决方案的另一个问题是,在我将 css 文件的路径和图像更改为绝对路径之前,不会加载 css 和图像。

    有没有其他方法可以解决,而不是把网站所有文件中的所有路径都改成绝对路径。

    非常感谢。

    【讨论】:

    • 这不是对 Jono Alderson 问题的回答。请打开一个新问题。
    【解决方案3】:
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^([^/]+)/$ $1.php
    RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
    RewriteRule (.*)$ /$1/ [R=301,L]
    

    像魅力一样工作 - 感谢大家的帮助。

    【讨论】:

      【解决方案4】:

      您可以尝试解决问题here。虽然问题的解决方案不相关(但...),但问题本身提供了一组重写规则,您可以在自己的网站中使用这些规则。

      如果您需要 URL 中的符号,您可以只使用“.*”而不是特定的 A-Za-z0-9,但如果您正在寻找可能的尾部斜杠,您可能需要使用“.*?”反而。这是一个标准的正则表达式功能,可以避免“.*”的贪婪。

      【讨论】:

      • 嗯。这有点帮助,它导致我现在使用: RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^([^/]+)/$ $1.php # Forces a trails slash待添加 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$ RewriteRule (.* )$ /$1/ [R=301,L] 这很好用(去掉 .php. 并强制使用斜杠),除非在子目录中,当它给出 404 错误时:(
      • !(\.[a-zA-Z0-9]{1,5}|/)$ 应该是 !(([a-zA-Z0-9]/?)+)美元。如果我没记错的话,它将匹配所有字母数字字符,后跟一个(可选)“/”,并匹配一次或多次。
      【解决方案5】:

      对于路径,您可以将<base href="yourpath" /> 添加到您的 php 页面。

      【讨论】:

        【解决方案6】:

        试试这个,这个可以在我的 Apache 上运行,即使你手动删除了最后一个斜线:

        Options +FollowSymLinks -MultiViews
        RewriteEngine On
        
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
        RewriteRule (.*)\.php$ /$1/ [L,R=301]
        RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
        RewriteRule (.*)$ /$1/ [R=301,L]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-02
          • 2012-04-15
          • 1970-01-01
          • 1970-01-01
          • 2017-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多