mod_rewrite 将 / 替换为 _

mod_rewrite 将 / 替换为 _

当然,我只是忽略了一些明显的东西,但我有这个:

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

我想将 /shop/basket 重写为 /shop_basket.php。但如果我转到 /,则会收到内部服务器错误;如果我转到 /shop/basket,则会陷入无限循环。

有任何想法吗?

答案1

第四幕:不,真的,就是这样!

事实证明,摆脱它比我想象的要容易[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

现在可以接受吗?:-)


第三次尝试:(不那么)最终的解决方案

好的,之后很多经过测试和敲击键盘,我终于想出了一个令人满意的办法。我肯定会保留这个办法,以防万一我出于某种原因切换回 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操作确实很棒,因为它们允许您通过文件的常用名称访问文件,即使正在进行所有这些其他重写。

我注意到我得到了无限的路径重定向(Apache 无法检测到),就像shop/basket_checkout/basket_checkout/basket/checkout;那时我才意识到 Apache 本身正在将路径附加到替换路径的末尾!这样就[DPI]解决了这个问题。

RewriteCond第二个块中的额外内容应该是显而易见的:它可以防止无限重定向(即,如果foo.php不可用,则没有必要尝试foo.php.php,等等)。

让我们知道这对您有何帮助。


尝试二:不错的尝试,但没有成功

哎呀,比我最初想象的还要简单。更改[N][C],您就可以开始了。由于文档[N]说:

小心不要造成无限循环!

这正是这里发生的事情。;-)
我几乎在第一次尝试时就关闭了我的测试虚拟机——这很有趣!

但是,当 php 文件实际上不存在时,它会发生奇怪的事情。我会再测试一下。

相关内容