Php 301重定向也正在重写的URL

Php 301重定向也正在重写的URL,php,.htaccess,mod-rewrite,redirect,slim,Php,.htaccess,Mod Rewrite,Redirect,Slim,我正在使用Slim构建一个站点,它建议使用以下.htaccess代码创建漂亮的URL: RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [QSA,L] 这意味着像http://example.com/account/login将别名用于http://example.com/index.php/account/login,然后由我的前端控制器处理。到目前为止还不错 但是,如果有人明确导航到 http://example.co

我正在使用Slim构建一个站点,它建议使用以下
.htaccess
代码创建漂亮的URL:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
这意味着像
http://example.com/account/login
别名用于
http://example.com/index.php/account/login
,然后由我的前端控制器处理。到目前为止还不错

但是,如果有人明确导航到

http://example.com/index.php/account/login

我希望它首先重定向到:

http://example.com/account/login

然后的别名

http://example.com/index.php/account/login

这样,用户将看到
http://example.com/account/login
在他们的导航栏中

如何在
.htaccess
中同时处理这两个规则,最重要的是,不必对主机和域进行硬编码(
http://example.com
.htaccess
中的

这也应适用于子目录,例如:

http://example.com/site1/index.php/account/login
->
http://example.com/site1/account/login

使用相对于文档根目录位于
site1
目录中的
.htaccess
文件,无需将
site1
显式放入
.htaccess

试试这个:

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

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

在此规则之前,您需要一个新的重定向规则:

RewriteEngine On

RewriteCond $0#%{REQUEST_URI} ^([^#]*)#(.*)\1$
RewriteRule ^.*$ - [E=BASE:%2]

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

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

你会认为这很简单,但唉……不:(嗯,我在另一个问题中看到了你的答案,但它似乎对我不起作用。如果我在
重写规则
模式的开头有
^
,那不是要从一开始就尝试匹配URL吗?这个答案实际上是正确的-不确定你所说的在一开始匹配URL是什么意思…难道不是吗重定向?这适用于
http://localhost/index.php/blah
,但不是
http://localhost/site1/index.php/blah
(假设我的
.htaccess
文件位于相对于我的文档根目录的
/site1
目录中)。如果.htaccess位于
site1
中,则需要一个
RewriteBase
(请参阅更新的规则)。是否有办法对基本项进行正则表达式匹配?否则,我的软件的每个用户都需要分别配置他们的
.htaccess
。我不想增加额外的复杂性。