【问题标题】:Remove trailing slashes删除尾部斜杠
【发布时间】:2009-06-30 14:07:27
【问题描述】:

我想处理没有尾部斜杠的页面。所以现在我希望我的带有斜杠的 URL 重定向(使用 .htaccess)到没有斜杠的同一个 URL。

我有两个 .htaccess 文件:

<IfModule mod_rewrite.c>
  RewriteEngine On

  RewriteRule (.*)  public/$1
</IfModule>

还有一个在我的公共文件夹中:

DirectoryIndex index.html index.php
Options -Indexes

<IfModule mod_rewrite.c>
    RewriteEngine On        
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f         
    RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
</IfModule>

我尝试将以下规则添加到公用文件夹中的 .htaccess 文件中:

RewriteRule (.*)/$ $1 [R,L]

然后: example.com/public/page/view/2/

重定向到: example.com/**D:/webserver/**public/page/view/2

这显然不是我想要的……

【问题讨论】:

  • 我不确定如何解决您的问题,但我不确定这是否真的是您应该做的。据我了解,请求这样的网址:example.com/myDir 实际将用户重定向到example.com/myDir。这种额外的重定向可以通过尾部斜杠来避免。这个斜线明确地表明“myDir”是一个目录而不是一个文件。
  • 你是说尾部斜杠是一些正式/标准/默认符号的一部分。在那种情况下,我有一个类似的问题。如何重定向以添加斜杠 ;-)
  • 由于您实际上并没有尝试重定向到目录,因此尾部斜杠对您根本没有帮助 - 事实上,它不会以任何方式做任何事情。你应该随心所欲地选择你喜欢的东西,并在使用中保持一致

标签: apache .htaccess mod-rewrite


【解决方案1】:

Wordpress 重定向取决于您的永久链接结构。因此,对 .htaccess 的任何更改都无济于事,因为 Wordpress 会为您添加/删除它们,并在 .htaccess 完成操作后执行 wp_redirect()。在最坏的情况下,您最终会出现重定向循环。

解决方案是使用关闭 Wordpress 重定向。

// perhaps an if(is_something()) before here ...
add_filter('redirect_canonical', '__return_false');

您应该将其包装在 if 语句中,或者在您对某个页面/目录/等执行检查的地方。将上述内容直接放在您的函数文件中将关闭 wordpress 重定向并可能会破坏。

【讨论】:

    【解决方案2】:

    为什么你有几个 .htaccess 文件?重定向到 public/$1 的重定向存储在哪里?您很可能会面临使事情复杂化的重写 RewriteRule 指令。

    在不了解您的设置的情况下,很难说您应该如何使用重写 - 您能指定实际的样子吗?

    【讨论】:

    • 我已将其全部缩减为一个 .htaccess 文件。在调试时,我意识到某些浏览器会自动添加斜杠,因为访问页面的一些历史记录。清除我的互联网历史记录,添加 rewritecond 和 rewriterule 就可以了。
    【解决方案3】:

    您是否尝试过添加:

    RewriteBase /public
    

    到公用文件夹中的.htaccess文件,获取:

    <IfModule mod_rewrite.c>
        RewriteEngine On            
        RewriteBase /public
    
        RewriteRule (.*)/$ $1 [R,L]
    
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f         
        RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
    </IfModule>
    

    【讨论】:

    • 你的意思是它在没有这一行的情况下重定向,但不使用它重定向?此外,您的问题还不清楚您将“RewriteRule (.*)/$ $1 [R,L]”放在“.htaccess”文件中的哪个位置。
    • 使用您的代码,我得到以下结果:example.com/page/view/1 >> 404 error example.com/page/view/1/ >> Redirects to example.com/public /page/view/1 然后显示 404 消息
    【解决方案4】:

    这是 Apache 文档中的一个示例,您可以使用它来解决您的问题:

    斜线问题

    说明:

    每个网站管理员都可以为引用目录的 URL 的尾部斜杠问题唱一首歌。如果它们丢失,服务器会转储一个错误,因为如果你说 /~quux/foo 而不是 /~quux/foo/,那么服务器会搜索一个名为 foo 的文件。而且因为这个文件是一个它抱怨的目录。实际上,它在大多数情况下都会尝试自行修复,但有时需要您模拟这种机制。例如,在您对 CGI 脚本等进行了大量复杂的 URL 重写之后。

    解决方案:

    解决这个微妙问题的方法是让服务器自动添加尾部斜杠。要正确执行此操作,我们必须使用外部重定向,以便浏览器正确请求后续图像等。如果我们只进行内部重写,这仅适用于目录页面,但当任何图像包含在此页面中时会出错使用相对 URL,因为浏览器会请求内联对象。例如,在 /~quux/foo/index.html 中对 image.gif 的请求将变为 /~quux/image.gif 而没有外部重定向!

    所以,为了实现这个技巧,我们编写:

    RewriteEngine  on
    RewriteBase    /~quux/
    RewriteRule    ^foo$  foo/  [R]
    

    疯狂和懒惰的人甚至可以在其 homedir 的顶级 .htaccess 文件中执行以下操作。但请注意,这会产生一些处理开销。

    RewriteEngine  on
    RewriteBase    /~quux/
    RewriteCond    %{REQUEST_FILENAME}  -d
    RewriteRule    ^(.+[^/])$ $1/ [R]
    

    Source

    【讨论】:

      猜你喜欢
      • 2015-06-20
      • 2015-01-15
      • 1970-01-01
      • 2020-08-29
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多