【问题标题】:Rewrite Rule with dynamic hostname使用动态主机名重写规则
【发布时间】:2011-07-16 07:02:30
【问题描述】:

我对修改一些 url 和路径的重写规则很感兴趣。这里有一些例子。 我有一些主机名通过 Apache conf 中的 ServerAlias 查找 1 个 VirtualHost。
example.com
anotherdomain.com
same.org

还有很多其他域。在这里,我想做的事:

example.com/uploads/photo.png -> /www/example.com/uploads/example.com/photo.png<br />

anotherdomain.com/uploads/photo.png -> /www/anotherdomain.com/uploads/anotherdomain.com/photo.png<br />

其他域也是如此。这个东西我已经做好了。

RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$
RewriteRule ^uploads/([a-zA-Z0-9-\._]+)$ uploads/%2/$1 [L]

这项工作完美无缺。但是,如果我尝试访问 uploads/icons/category/image.png
我开始看到 500 内部 Apache 错误... 我已将 Rule 修改为:

RewriteCond %{REQUEST_URI} !^/uploads/%{HTTP_HOST}
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$
RewriteRule ^uploads/([a-zA-Z0-9-\._/]+)$ uploads/%2/$1 [L]

并启用 Apache 重写日志,详细程度为 9。

RewriteCond: input='/uploads/icons/category/image.png' pattern='!^/uploads/%{HTTP_HOST}' => matched
rewrite 'uploads/icons/category/image.png' -> 'uploads/example.com/icons/category/image.png'
RewriteCond: input='/uploads/example.com/icons/category/image.png' pattern='!^/uploads/%{HTTP_HOST}' => matched
rewrite 'uploads/example.com/icons/category/image.png' -> 'uploads/example.com/example.com/icons/category/image.png'

在那之后,它用尽了 10 次查找 =(
当我修改这个

RewriteCond %{REQUEST_URI} !^/uploads/example.com
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$
RewriteRule ^uploads/([a-zA-Z0-9-\._/]+)$ uploads/%2/$1 [L]

它适用于所有东西,但仅适用于 1 个域:example.com
我找到了另一个解决方案,但它并不完美。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$
RewriteRule ^uploads/([a-zA-Z0-9-\._/]+)$ uploads/%2/$1 [L]

此规则仅在我存在目录和文件时才有效。但是,如果我尝试访问:
/uploads/images/not-existed-404.nothing -> 它返回 500,因为此文件不存在并重写为:

/uploads/example.com/example.com/example.com/example.com.......

附注对不起我的英语不好;)

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:
    RewriteCond %{REQUEST_URI} !^/uploads/%{HTTP_HOST}
    

    您不能在模式中使用变量或反向引用——即%{HTTP_HOST} 不会扩展为example.com,而是会被视为普通文本。


    您可以使用这些规则(在我的电脑上运行良好):

    RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$
    RewriteCond %{DOCUMENT_ROOT}/uploads/%2/$1 -f
    RewriteRule ^uploads/(.+)$ uploads/%2/$1 [L]
    
    1. 此规则将检查目标文件是否存在,然后才重写(条件顺序很重要)。

    2. 假设:

      • 域名:example.com
      • 网站根:/www/example.com/
      • 请求的 URL:/uploads/img/meow.png

      第二个条件 (RewriteCond %{DOCUMENT_ROOT}/uploads/%2/$1 -f) 将检查文件 /www/example.com/uploads/example.com/img/meow.png 是否存在,如果存在,则进行重写。

    您的 .htaccess 可能如下所示:

    RewriteEngine On
    RewriteBase /
    
    # do not do anything for already existing files & folders
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule .+ - [L]
    
    # rewrite uploads to domain-specific folder
    RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$
    RewriteCond %{DOCUMENT_ROOT}/uploads/%2/$1 -f
    RewriteRule ^uploads/(.+)$ uploads/%2/$1 [L]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      • 2017-11-24
      • 2019-01-17
      • 1970-01-01
      • 2018-05-06
      • 2014-02-02
      • 1970-01-01
      相关资源
      最近更新 更多