我有一个网站,如果用户转到www.example.com/string
并且string.jpg
中存在www.example.com/images/profile/
,那么我希望它重定向到www.example.com/index.php?u=string
但是如果图像不存在我希望它重定向到www.example.com
。
我已尝试在.htaccess中使用以下内容
RewriteRule ^(.*)$ /index.php?u=$1 [NC,L,QSA]
但即使图像没有退出,也会重定向evrything
答案 0 :(得分:0)
因此,如果用户请求页面A,并且文件B存在,请转到C?
我不认为apache开发人员认为只有在某些存在的情况下重定向才有用。至少我看不到目的。
但如果所有内容都重定向到index.php,那么就把代码放在那里检查文件的存在,然后让index.php再次重定向到首页。
但是,反过来也不是index.php的默认页面吗?
答案 1 :(得分:0)
您需要使用RewriteCond检查文件是否存在。如果是,则重定向到该图像,否则将请求传递给index.php
# Make sure it's not a direct URL to a file or a directory.
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
# Check if the request URI exists in the images folder.
RewriteCond %{DOCUMENT_ROOT}/images/profile%{REQUEST_URI}.jpg -f
# If the image exists, redirect to that.
RewriteRule ^ %{DOCUMENT_ROOT}/images/profile{%REQUEST_URI}.jpg [L]
# By default, pass the request string to our application.
RewriteRule ^ index.php?u=%{REQUEST_URI} [L,QSA]
答案 2 :(得分:0)
你需要检查file_exists('filename'),一个现有的PHP函数。
然后您可以相应地使用PHP标头重定向。
这将完全避免RewriteRule,您可以添加适当的PHP标头。
为了使这项工作,您需要在URL中检测文件 .jpg,将请求发送到PHP文件(检查文件是否存在),然后最终重定向您想要使用的PHP重定向标题。
答案 3 :(得分:-1)
为什么不在PHP中这样做呢?您的重写规则会重定向所有内容,因此请将其保留。现在只需在index.php中输入以下代码:
<?php
if( isset($_GET['u']) && !file_exists('./images/profile/'.basename($_GET['u'])) ) {
header('Location: http://www.example.com');
exit(0);
}
//Do all your other wonderful stuff here.. for instance:
if( isset($_GET['u']) && file_exists('./images/profile/'.basename($_GET['u'])) {
header('Content-Type: image/png');
readfile('./images/profile/'.basename($_GET['u']));
exit(0);
} else {
echo("Hello world!");
}
显然要注意不要创建一个无限循环重定向(例如,如果index.php是你的默认页面,将人们重定向到默认页面会将它们置于无限循环中,重定向到同一页面。)