从url中删除/重定向index.php以防止重复的URL

Mar*_*łek 2 php apache .htaccess mod-rewrite laravel

在标记为重复之前,请仔细阅读该问题.

我们都知道,用于.htaccess:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
Run Code Online (Sandbox Code Playgroud)

我们可以将所有流量重定向到index.php所以我们可以创建友好的URL并拥有一个前端控制器.

虽然问题与mod_rewriteLaravel描述的问题有关.

以下.htaccess是Laravel 4的默认设置,它可以正常工作:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

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


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

</IfModule>
Run Code Online (Sandbox Code Playgroud)

如果我们运行url mydomain.com/somethingsomething正确设置该路由,则会启动某个控制器.它到目前为止工作正常.

但是Laravel 4我们将能够使用相同的路线mydomain.com/index.php/something.可能使用Laravel url创建我们将index.php在url中没有url但是还有一些其他问题.

例如,如果我们的竞争对手会让我们受到伤害,他们可以简单地将互联网单链接用于网址mydomain.com/index.php/something,mydomain.com/index.php/something2依此类推,搜索引擎会看到重复的网址.

当然,如果我们有我们的自定义PHP应用程序,我们可以在PHP中完成它而不需要简单地检查问题$_SERVER['REQUEST_URI']并进行301重定向.我们当然可以在Laravel中做同样的事情,但我们每次都必须用PHP编写这段代码,可能一些开发人员可能会说用PHP做这个代码是不好的做法.

问题很简单:如何将.htaccess中包含index.php的所有网址重定向到没有index.php的同一网址?

应重定向的示例网址:

  1. mydomain.com/index.php/something应重定向到mydomain.com/something (可能是任何东西 - 可以包含任何字符)
  2. mydomain.com/index.php 应重定向到 mydomain.com
  3. mydomain.com/index.php?anything应该重定向到mydomain.com(任何东西都可以包含任何字符)
  4. mydomain.com/index.phpanything应该被重定向到mydomain.com任何可以包含任何字符的东西)

anu*_*ava 8

RewriteEngine On在行下面插入这些规则:

RewriteCond %{THE_REQUEST} /index\.php [NC]
RewriteRule ^(.*?)index\.php[^/] /$1? [L,R=302,NC,NE]

RewriteCond %{THE_REQUEST} /index\.php [NC]
RewriteRule ^(.*?)index\.php(?:/(.*))?$ /$1$2? [L,R=302,NC,NE]
Run Code Online (Sandbox Code Playgroud)

  • 是的,我注意到你使用了302重定向而不是301.但顺便说一下,如我在这个问题中所展示的那样框架根本不关心重复的网址是很奇怪的.他们应该在`.htaccess`文件中默认提供那些(或类似的)规则 (2认同)