【问题标题】:mod_rewrite, avatar set upmod_rewrite,头像设置
【发布时间】:2009-07-15 22:38:31
【问题描述】:

我想使用 mod_rewrite 来处理我的头像图像请求。 我有一个包含所有 .png 图像的文件夹,该文件以帐户的用户名命名。

所以我想请求/avatar/Juddling 来显示图像,/images/avatars/Juddling.png 但如果该文件不存在,我希望它显示default.png 图像。

Options +FollowSymLinks
Options +Indexes
Options -MultiViews
RewriteEngine On

RewriteRule ^avatar/(.*)$ images/avatars/$1.png [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^avatar/(.*)$ images/avatars/default.png [NC,L]

Apache 似乎只处理第一个 RewriteRule,因为如果头像不存在而不是看到默认图像,我会得到 404。

【问题讨论】:

    标签: regex apache mod-rewrite


    【解决方案1】:

    尝试重新编写它,以便首先进行测试,这样:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^avatar/(.*)$ images/avatars/default.png [NC,L]
    
    RewriteRule ^avatar/(.*)$ images/avatars/$1.png [NC,L]
    

    【讨论】:

      【解决方案2】:

      反过来试试:

      RewriteCond %{DOCUMENT_ROOT}images/avatars/$1.png -f
      RewriteRule ^avatar/([^/]+)$ images/avatars/$1.png [L]
      RewriteRule ^avatar/([^/]+)$ images/avatars/default.png [L]
      

      【讨论】:

      • 这对我不起作用,我认为这是因为在第一个条件下,您使用的是反向链接 $1,但尚未告知 apache 使用 URL 的哪一部分,所以它是否在寻找文件 /images/avatars/avatar/Juddling.png?因为所有请求都作为默认图像出现。
      • $1 将保存对应的RewriteRule 模式的匹配(有关技术细节,请参阅httpd.apache.org/docs/2.2/rewrite/rewrite_tech.html)。但是您可能需要将/ 添加到第一个表达式:%{DOCUMENT_ROOT}/images/avatars/$1.png。如果这不起作用,请使用 mod_rewrite 的日志记录功能(请参阅 httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteloglevel)查看该表达式的计算值。
      【解决方案3】:

      %{REQUEST_FILENAME}在你重写的时候不会更新,保持原来的值,所以你需要花点心思:

      RewriteRule ^avatar/(.*)$ images/avatars/$1.png [NC]
      RewriteCond %{DOCUMENT_ROOT}/images/avatars/$1.png !-f
      RewriteRule ^avatar/(.*)$ images/avatars/default.png [NC,L]
      

      【讨论】:

      • 这给出了与我的 .htaccess 相同的结果,显示的是 404 而不是 default.png。
      【解决方案4】:
      Options +FollowSymLinks
      Options -MultiViews
      
      RewriteEngine On
      
      RewriteCond %{DOCUMENT_ROOT}/images/avatars/$1.png -f
      RewriteRule ^avatar/(.*[^/])?$ /images/avatars/$1.png [L]
      RewriteRule ^avatar/(.*[^/])?$ /images/avatars/default.png [L]
      

      此代码有效!我从来没有真正了解过正则表达式,但它是“(。* [^/])?”导致问题的部分,我不确定这是什么意思,但问题已解决!

      感谢你们的帮助!

      【讨论】:

      • 你为什么还要使用(.*[^/])??为什么要让/avatar/ 之后的部分为空?
      • 我不知道这个表达是什么意思我害怕,我从另一个例子中复制了它。但是只有 (.*) 它总是返回 default.png 图像,这意味着条件有问题。
      猜你喜欢
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2012-06-03
      • 1970-01-01
      相关资源
      最近更新 更多