使用 RewriteRule 将任何请求重定向到 PHP 脚本,无需外部重定向
Using RewriteRule to redirect any request to PHP script without external redirects
我使用 WampServer
(Apache/PHP/MySQL),我的 www
目录中有以下文件:
www
[目录]
test
[目录]
index.php
[文件]
.htaccess
[文件]
我想将所有 URI 请求作为参数传递给 index.php
而不会导致任何外部重定向(客户端浏览器中的位置更改)。所以我尝试使用以下规则:
RewriteRule ^(.*)$ index.php?path= [nocase,qsappend,end]
效果很好,除非 URI 是 /test
,在这种情况下,外部重定向会将位置更改为:
/test/?path=test
如何确保即使存在与 URI 同名的目录也不会发生外部重定向?
预期结果:
- 原始 URI 请求:
/test
- 内部重定向:
index.php?path=test
- 外部重定向:none
实际结果:
- 原始 URI 请求:
/test
- 内部重定向:
index.php?path=test
- 外部重定向:
/test/?path=test
理想的解决方案是通用的,不仅适用于 test
目录,而且适用于任何目录。
好的,问题似乎是 mod_rewrite
和 mod_dir
之间的冲突。可能的解决方案是:
- 禁用
mod_dir
Put this to .htaccess
:
<IfModule mod_dir.c>
DirectorySlash Off
</IfModule>
有关 mod_rewrite
和 mod_dir
如何交互的更多详细信息,this answer has some excellent info. And why the external redirect is necessary is explained in docs (Trailing Slash Problem)。
相关链接
- DirectorySlash documentation
- More mod_rewrite/mod_dir shenanigans
我使用 WampServer
(Apache/PHP/MySQL),我的 www
目录中有以下文件:
www
[目录]test
[目录]index.php
[文件].htaccess
[文件]
我想将所有 URI 请求作为参数传递给 index.php
而不会导致任何外部重定向(客户端浏览器中的位置更改)。所以我尝试使用以下规则:
RewriteRule ^(.*)$ index.php?path= [nocase,qsappend,end]
效果很好,除非 URI 是 /test
,在这种情况下,外部重定向会将位置更改为:
/test/?path=test
如何确保即使存在与 URI 同名的目录也不会发生外部重定向?
预期结果:
- 原始 URI 请求:
/test
- 内部重定向:
index.php?path=test
- 外部重定向:none
实际结果:
- 原始 URI 请求:
/test
- 内部重定向:
index.php?path=test
- 外部重定向:
/test/?path=test
理想的解决方案是通用的,不仅适用于 test
目录,而且适用于任何目录。
好的,问题似乎是 mod_rewrite
和 mod_dir
之间的冲突。可能的解决方案是:
- 禁用
mod_dir
Put this to
.htaccess
:<IfModule mod_dir.c> DirectorySlash Off </IfModule>
有关 mod_rewrite
和 mod_dir
如何交互的更多详细信息,this answer has some excellent info. And why the external redirect is necessary is explained in docs (Trailing Slash Problem)。
相关链接
- DirectorySlash documentation
- More mod_rewrite/mod_dir shenanigans