【发布时间】: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/something、mydomain.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任何东西都可以包含任何字符)
【问题讨论】:
标签: php regex apache .htaccess mod-rewrite