0

编辑:以更一般的方式提出相同的问题:如何在 htaccess 中重写 URL,以便在 php 中看到重写的表单$_SERVER['REQUEST_URI']


如果用户通过 URL 请求(现有)epub 或 mobi 文件,我想捕获并重定向请求,以便 Flight php 路由器将通过其路由之一处理它。(为了记录下载次数。)所以,请求

http://example.com/book.epub

应该改写为

http://example.com/download/epub

然后应该将其馈送到路由器,就好像它是原始请求一样。这是不起作用的:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # not using [L] flag, so that the modified request gets handled later
    # for book.epub this rule should produce /download/epub etc.
    RewriteRule ^book\.(epub|mobi)$ /download/$1 [QSA]

    # Flight rewrite rules
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

问题 #1是现有 REQUEST_FILENAME 的测试仍然成功(它检查原始请求,而不是重写的表单)。但是测试必须保留,当然,这样对图像、css 和其他常规“资产”的请求就不会被转发到路由器。

但是,也存在问题 #2:即使请求的文件实际上不存在,Flight 仍然无法看到重写的 URL。在内部,它查看$_SERVER['REQUEST_URI'],因此它看不到请求的重写形式。我正在努力实现的目标是可能的吗?(也许使用不同的路由器?)

4

1 回答 1

0

FWIW,我不得不在 php 中使用一条包罗万象的路线,并将这些请求作为“特例”拦截在那里。

出于某种原因,我希望在 $_SERVER 字段之一中看到重写的 URL,但它在那里不可用。

于 2018-03-29T12:41:36.063 回答