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

Posted

技术标签:

【中文标题】从 url 中删除/重定向 index.php 以防止重复的 url【英文标题】:Remove/Redirect index.php from url to prevent duplicate urls 【发布时间】:2014-09-26 04:05:55 【问题描述】:

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

我们都知道,使用.htaccess:

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

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

虽然该问题与mod_rewrite 有关,但该问题已针对 Laravel 进行了描述。

以下.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>

如果我们运行 url mydomain.com/something 并为something 正确设置了该路由,则会启动一些控制器。到目前为止它运行良好。

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

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

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

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

应重定向的示例网址:

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

【问题讨论】:

【参考方案1】:

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)我不明白为什么两个规则中的 RewriteCond 是相同的。 2)mydomain.com/index.php/something 重定向到 mydomain.com//something(双斜杠)3)mydomain.com/index.php?anything 重定向到 mydomain.com/?anything 而不是 mydomain.com 其他 2 条规则 mydomain.com/index.phpanythingmydomain.com/index.php 按预期工作 现在检查更新的规则。 RewriteCond 行相同,但 URI 匹配模式在 2 条规则中不同。 不客气,很高兴它成功了。请记住将302 更改为301 以使其永久重定向。 是的,我注意到您使用了 302 重定向而不是 301。但顺便说一下,正如我在这个问题中所展示的那样,框架根本不关心重复的 url,这很奇怪。默认情况下,他们应在其.htaccess 文件中提供这些(或类似)规则 只想说,这段代码在2020年完美运行。Laravel 6.x【参考方案2】:

如何在 .htaccess 中重定向所有包含 index.php 的 url 到 没有index.php的同一个url?

将此添加到您的 .htaccess 中

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

【讨论】:

对我来说它不起作用。 mydomain.com/index.php 将我的 url 重定向到 mydomain.com/home/testsite/public_html 以便在 url 中显示我的文件路径【参考方案3】:

对于 nginx,这里是规则:

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

【讨论】:

【参考方案4】:

这解决了我在 Kohan 2.3 中强制 https 并从 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]

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

以上是关于从 url 中删除/重定向 index.php 以防止重复的 url的主要内容,如果未能解决你的问题,请参考以下文章

text nginx重定向循环,从url中删除index.php

提交后保留$ _POST数据,同时删除重定向URL中的index.php

如何在 Codeigniter 中重定向和删除 index.php [重复]

删除 404 重定向上的所有 url 参数

htaccess 从 url 中删除 index.php

Laravel - 以 .php 结尾的重定向捕获/重定向 URL