您好我正在尝试完成以下操作:
1)删除尾部斜杠
2)即使存在与url中名称相同的目录,也将每个请求重定向到root index.php。我们假设我有一个名为'users'的文件夹,我不希望'http://local.dev/users'将我重定向到该文件夹,而是通过php处理它,就像其他请求一样。
3)我希望能够访问任何类型的图像,js,css和其他一些特定的文件类型 即使它们在目录中。
到目前为止我所拥有的是:
RewriteEngine on
RewriteBase /
RewriteRule ^(.*)/$ $1 [R=301,L]
RewriteCond %{REQUEST_URI} !^.*\.(png|jpg|jpeg|bmp|gif|css|js|json|csv)$ [NC]
RewriteRule ^(.*)$ index.php?path=$1 [NC,L,QSA]
和用于测试案例的php:
<!DOCTYPE html>
<html>
<head>
<title>+dev</title>
</head>
<body>
<?php
echo $_SERVER['REQUEST_URI'] . '<br>';
print_r($_GET);
echo '<br>';
include 'test/test.php';
?>
<img src="/image.jpg">
<img src="/test/image2.jpg">
</body>
</html>
但是我注意到以下问题:
请记住,我在htaccess和index.php旁边的根目录中有一个名为test的文件夹
http://local.dev/test/image.jpg =工作
http://local.dev/somestring =工作
http://local.dev/someImage.jpg =工作
最后两种情况下的浏览器网址输出:
http://local.dev/test?path=test&path=test&path=test&path=test&path=test&path=test&path=test&path=test&path=test&path=test
Yeap重定向循环,但我无法弄清楚为什么因为我不熟悉mod_rewrite。我想要的是,无论是否存在具有相同名称的文件夹,最后2个失败的请求都被视为普通请求。虽然我希望如果它们的扩展名在“允许列表”上,则可以访问该文件夹中的文件。
答案 0 :(得分:0)
更改为:
RewriteEngine on
RewriteBase /
RewriteRule ^(.*)/$ $1 [R=301,L]
RewriteRule !\.(png|jpg|jpeg|bmp|gif|css|js|json|csv)$ index.php [NC,L]
答案 1 :(得分:0)
发生这种情况的原因是mod_dir and the DirectorySlash
directive。本质上,如果它看到没有尾部斜杠的URI,并且它映射到现有目录,那么它将重定向请求以使其具有尾部斜杠。由于mod_dir和mod_rewrite都位于URL文件处理管道中的不同位置,因此mod_dir和mod_rewrite都应用于同一URL。
所以你需要关闭DirectorySlash
(可以将它放在你的htaccess文件中的任何地方):
DirectorySlash Off