Php Apache重写aaa/bbb/ccc几乎可以正常工作,但不是很好

Php Apache重写aaa/bbb/ccc几乎可以正常工作,但不是很好,php,apache,.htaccess,mod-rewrite,Php,Apache,.htaccess,Mod Rewrite,我想浏览并将aaa/bbb/ccc传递给一个PHP脚本,同时在浏览器地址栏中维护好的永久链接 这是我的.htaccess文件: RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.*) apache/not_index.php?slug=$1 这里不是_index.php: <b>not_index.php</b> for testing Apache rewr

我想浏览并将aaa/bbb/ccc传递给一个PHP脚本,同时在浏览器地址栏中维护好的永久链接

这是我的.htaccess文件:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) apache/not_index.php?slug=$1
这里不是_index.php:

<b>not_index.php</b> for testing Apache rewrite.<br>
This directory contains <em>.htaccess</em>, <em>not_index.php</em> and the empty directory <em>empty_dir</em>.
<?php
echo "<p>\$_GET:</p>";
echo "<pre>";
print_r($_GET);
echo "</pre>";
?>

这是因为
mod_dir
在目录后添加了一个尾随斜杠。你的规则是这样的:


这听起来很可疑。添加一个
[L]
标志(您无论如何都应该具有该标志),但也可以清除浏览器的缓存或在其他浏览器中测试它。当您尝试键入重写的URL进行测试时,一些(众所周知的Firefox)可能会突然替换历史记录中的URL,并且非常努力地提供该历史记录URL,而不是您想要的类似URL。您没有执行重定向
[R]
,因此没有理由更改地址栏,除非浏览器行为不正常。等等,
空目录
实际上作为目录存在吗?通常您还需要
RewriteCond%{REQUEST\u FILENAME}-d
除了您已经具备的条件之外,我在Firefox和Chrome中得到完全相同的结果,如果我关闭浏览器也没有什么区别
empty_dir
实际上作为目录存在,但slug可以与目录同名。我刚刚尝试添加
RewriteCond%{REQUEST\u FILENAME}-d
但如果我尝试浏览到ncvp.co.uk/apache或ncvp.co.uk/empty\u dirI,我会得到“403禁止”,我已经尝试了您建议的规则,但我得到的地址栏完全相同
http://ncvp.co.uk/apache/empty_dir/?slug=empty_dir
当我浏览到
http://ncvp.co.uk/apache/empty_dir
这是由于浏览器缓存造成的。在新浏览器或清除浏览器缓存中进行测试。正如我在上面的评论中所解释的,我在Firefox和Chrome中得到相同的行为,如果我关闭并重新打开浏览器,打开并关闭将没有帮助,除非你清除浏览器缓存。这是经过适当测试和验证的代码,在Android浏览器中也观察到了同样的行为
DirectoryIndex apache/not_index.php
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) apache/not_index.php?slug=$1 [L]
# turn auto trailing slash off
DirectorySlash Off
RewriteEngine On
RewriteBase /

# add a trailing slash to directories
RewriteCond %{DOCUMENT_ROOT}/$1 -d
RewriteRule ^(.*?[^/])$ %{REQUEST_URI}/ [L,R=302]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/?$ apache/not_index.php?slug=$1 [L,QSA]