.htaccess mod_rewrite子目录,带有文件扩展名条件

时间:2012-12-29 09:44:28

标签: .htaccess mod-rewrite

我正在尝试重写链接          domain.com/user/upload/12345.jpgdomain.com/12345.jpg,但仅限于文件扩展名为jpggifpng的情况。 我想,它应该是这样的:

     RewriteRule ^user/upload/$ /$1 [L, QSA]

但我的版本不起作用。我该如何解决?

2 个答案:

答案 0 :(得分:1)

我假设您的真实路径是用户/上传,并且您希望它像在根目录中一样(对我来说很有意义)。否则,只需改变路径。

我认为这样做会有所帮助。

RewriteRule ^([^\.]+)\.(jpg|gif|png)$ http://domain.com/user/upload/$1.$2 [NC,L]

或者,也是这样:

RewriteRule ^(.+?)\.(jpg|gif|png)$ http://domain.com/user/upload/$1.$2 [NC,L]

你没有查询字符串来传递QSA(例如:?id=5&name=myname,在?是查询字符串之后)。

修改

如果您想保留远程重定向的重写URL,可以将所有匹配重定向到本地文件,如:remoteimage.php:

RewriteRule ^(。+?)。(jpg | gif | png)$ remoteimage.php?filename = $ 1& extension = $ 2 [NC,L]

此文件将读取图像并将其重新发送到浏览器...

类似的东西:

<?php
    // Remote image
    $filename = $_GET['filename'];
    $ext = $_GET['extension']; // Of course you will need some validations, etc.


    header('Content-type: image/' . ($ext != 'jpg' ? $ext : 'jpeg'));

    // This is the idea, you could use cURL, fopen, etc. and you probably need to validate response status code and received data
    $image = file_get_contens("http://domain.com/user/upload/{$filename}.{$extension}");

    echo $image;
?>

如果你使用像codeigniter,kohana等一些框架,你可能需要尝试捕捉阅读。

答案 1 :(得分:1)

你可以试试这个:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI}  /([^/]+)\.(jpg|jpeg|gif|png)$
RewriteRule .* http://domain.com/user/upload/%1.%2 [L]

将映射:

http://domain.com/any_name.any_extension

对此:

http://domain.com/user/upload/any_name.any_extension

方法

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}  (/m)?/([^/]+)\.(jpg|jpeg|gif|png)$
RewriteRule .* http://domain.com/user/upload%1/%2.%3

将映射:

http://domain.com/any_name.any_extension或此

http://domain.com/m/any_name.any_extension

对此:

http://domain.com/user/upload/any_name.any_extension或此

http://domain.com/user/upload/m/any_name.any_extension

取决于/m子目录的存在。