mod_rewritereplace/ with _

当然,我只是想在这里明显的东西,但我有这个:

RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule ^(.*)/(.*)$ $1_$2 [N] RewriteRule ^(.*)$ $1.php [QSA,L] 

我想重写/ shop / basket到/shop_basket.php。 相反,如果我去/我得到和内部服务器错误,如果我去/ shop / basket它陷入了一个无限循环。

有任何想法吗?

采取四:不,真的,这是它!

事实certificate,比我想摆脱[DPI]容易。 最终集合:

 RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule ^(.*)/(.*)$ $1_$2 [L] RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d RewriteCond %{REQUEST_URI} !\.php$ RewriteRule ^(.*)$ $1.php 

现在可以接受吗? 🙂


采取三:(不那么)最后的解决scheme

好吧,经过多次testing和敲打键盘,我终于想出了一些令人满意的东西。 我绝对保留这个以防万一我出于某种原因切换回Apache。

当我把问题分解成两部分时,灯泡熄灭了。 然后,最后添加.php 。 这是我终于想出来的:

 RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule ^(.*)/(.*)$ $1_$2 [DPI,N] RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d RewriteCond %{REQUEST_URI} !\.php$ RewriteRule ^(.*)$ $1.php [QSA] 

现在,正如我上面提到的,最大的问题是把这两个操作分开。 一旦我做到了,一切都变得容易了。 这两个RewriteCond真的很整洁,因为它们允许您按照通常的名称访问文件,即使所有这些其他重写都在进行。

我注意到,我得到了无限的pathredirect(Apache无法检测到),如shop/basket_checkout/basket_checkout/basket/checkout ; 那时候我意识到Apache本身就是把path追加到replacepath的末尾! 因此, [DPI]修复了这个问题。

在第二个块中额外的RewriteCond应该是显而易见的:它可以防止无限redirect(即,如果foo.php不可用,没有点尝试foo.php.php等)。

让我们知道这是如何工作的。


采取二:不错的尝试,但没有骰子

哎呀,比我想象的还要简单。 改变[N][C] ,你很好走。 正如文献[N]所说:

小心不要造成无限循环!

这正是这里发生的事情。 😉
我几乎拿下了我的testing虚拟机第一次尝试 – 这很有趣!

但是,当PHP文件实际上并不存在的时候,它会做一些奇怪的事情。 我会再testing一下。