【问题标题】:Redirect subdirectory names to the index.php for pretty URLs using mod_rewrite使用 mod_rewrite 将子目录名称重定向到 index.php 以获得漂亮的 URL
【发布时间】:2014-05-24 09:20:00
【问题描述】:

我在 Apache 服务器上有一个基于框架 (Laravel 4) 的网站,它带有一个 .htaccess 文件,用于删除尾部斜杠并将不存在的文件重定向到 index.php 以获得漂亮的 URL。

我使用 URL 的第一个片段进行本地化,例如 mysite.com/en/about。我还有用于本地化资源文件的物理语言文件夹,例如 /en/images/hello.jpg

物理语言文件夹以这种方式破坏 .htaccess 文件中的 URL 重定向:

  • mysite.com/en 自动重定向到文件夹根目录:mysite.com/en/
  • .htaccess 删除了尾部斜杠
  • 循环!

所以mysite.com/en 不能用于语言索引,我使用/en/home 作为解决方法。

库存 .htaccess 文件中的部分:

# Redirect Trailing Slashes...
RewriteRule ^(.*)/$ /$1 [L,R=301]

# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

是否可以将文件夹名称也重定向到index.php,而无需对其进行硬编码。这样;

  • mysite.com/en 被重定向到 index.php
  • mysite.com/en/images/about.jpg带来相关文件

【问题讨论】:

    标签: apache .htaccess mod-rewrite laravel-4


    【解决方案1】:

    问题似乎是您的尾部斜杠删除规则。用这条规则替换它:

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

    此规则将跳过目录以删除尾部斜杠,因此/en/ 将不受影响。

    PS:请务必在新浏览器中对此进行测试,以避免出现 301 缓存问题。

    【讨论】:

    • 好点!但是后面的斜杠被发送到 index.php,使解析器感到困惑。嗯,也许可以对目录名称使用另一个规则来重定向它们而不用尾部斜杠...我会做一些测试...
    • then the trailing slash is sent to the index.php 是什么意思?请注意,RewriteCond %{REQUEST_FILENAME} !-d 将跳过任何目录,RewriteCond %{REQUEST_FILENAME} !-f 将跳过任何要发送到index.php的文件
    • 啊,你是对的,如果没有更多的修改,它永远不会发送 -)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2012-04-02
    • 2014-07-08
    • 2017-04-25
    • 2021-03-22
    相关资源
    最近更新 更多