![mod_rewrite 将 / 替换为 _](https://linux22.com/image/507058/mod_rewrite%20%E5%B0%86%20%2F%20%E6%9B%BF%E6%8D%A2%E4%B8%BA%20_.png)
当然,我只是忽略了一些明显的东西,但我有这个:
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 文件实际上不存在时,它会发生奇怪的事情。我会再测试一下。