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

时间:2014-08-03 14:52:50

标签: php apache .htaccess mod-rewrite laravel

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

我们都知道,在.htaccess中使用:

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

我们可以将所有流量重定向到index.php,这样我们就可以创建友好的网址并拥有一个前端控制器。

虽然问题与mod_rewrite有关,但Laravel描述了这个问题。

Laravel 4默认使用以下.htaccess,它可以正常工作:

<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>

如果我们运行网址mydomain.com/something并且已正确设置something的路由,则会启动某个控制器。它到目前为止工作正常。

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

例如,如果我们的竞争对手想让我们受到伤害,他们可以简单地将互联网单一链接添加到mydomain.com/index.php/somethingmydomain.com/index.php/something2等网址,搜索引擎会看到重复的网址。< / p>

当然,如果我们有我们的自定义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任何可以包含任何字符的内容)

5 个答案:

答案 0 :(得分:6)

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]

答案 1 :(得分:0)

  

如何将.htaccess中包含index.php的所有网址重定向到   没有index.php的相同网址?

将此添加到.htaccess

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s(.*)/index\.php [NC]
RewriteRule ^ %1 [R=301,L]

答案 2 :(得分:0)

对于Nginx,这是规则:

location / {
    rewrite ^/(.*?)index\.php[^/] /$1? redirect;
    rewrite ^/(.*?)index\.php(?:/(.*))?$ /$1$2? redirect;
}

答案 3 :(得分:0)

这解决了我的问题迫使https&amp;从Kohan 2.3中的url中删除index.php

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]


RewriteRule ^(application|system) - [F,L]

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule .* index.php/$0 [PT,L]


RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?!localhost$|127\.0\.0\.1$)(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L,NE]

答案 4 :(得分:0)

花了几个小时后,我为我及其下面的代码100%工作编写了以下代码

将index.php重定向到非index.php

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