Mod rewrite Apache2-似乎重写条件并不总是适用
我只想在图像文件不存在时重定向到/lost/index.php。 当我尝试它时,它似乎对浏览器刷新不起作用 如果我使用服务器上存在的文件调用它Mod rewrite Apache2-似乎重写条件并不总是适用,mod-rewrite,apache2,browser-refresh,Mod Rewrite,Apache2,Browser Refresh,我只想在图像文件不存在时重定向到/lost/index.php。 当我尝试它时,它似乎对浏览器刷新不起作用 如果我使用服务器上存在的文件调用它 /images/image1.jpg 它向我显示一个文件(好-文件存在) 但是如果我刷新浏览器,它会将我重定向到/lost/index.php(这很糟糕) 在我的规则之下 RewriteEngine On RewriteLog /var/log/apache2/rewrite.log RewriteLogLevel 3 RewriteC
/images/image1.jpg
- 它向我显示一个文件(好-文件存在) 但是如果我刷新浏览器,它会将我重定向到/lost/index.php(这很糟糕)
RewriteEngine On
RewriteLog /var/log/apache2/rewrite.log
RewriteLogLevel 3
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/images/(.*)$ /lost/index.php?image=$1 [L,R]
有什么想法吗?所以我解决了
如果在元素中定义重写规则,它们应该如下所示
<Directory /var/www/local.example.com>
...
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^images/(.*)$ /lost/index.html?image=$1 [R]
</Directory>
这是因为,如果在每服务器上下文中使用(即,在请求映射到文件系统之前),SCRIPT_FILENAME和request_FILENAME不能包含完整的本地文件系统路径,因为在此处理阶段路径未知。在这种情况下,两个变量最初都将包含REQUEST_URI的值。为了在每个服务器上下文中获取请求的完整本地文件系统路径,请使用基于URL的前瞻%{LA-U:request_FILENAME}来确定request_FILENAME的最终值
同样重要的是,这两种情况下的模式必须不同。在第二种情况下,它必须以“/”开头,而在第一种情况下则不能。这是因为请求文件名在第二种情况下的开头包含“/”,但在第一种情况下不包含“/”将图像请求转发到html页面是个坏主意。当您将图像用作
时,浏览器需要图像而不是文本。重定向到文本未找到的图像
@Cheery这只是一个示例,我已将其更改为index.php-假设我要生成此缺少的图片检查浏览器在请求中发送的内容。规则看起来正确,不应依赖于刷新。或者,至少可以查看rewrite.logy,我猜测您的浏览器在测试时的某个阶段缓存了重定向,因此它会间歇性地使用缓存解析URL。我使用了类似的配置,没有任何问题。如果我使用%{LA-U:REQUEST\U FILENAME},一切都很好。下面是doc中的一个片段:如果在每服务器上下文中使用(即,在请求映射到文件系统之前),SCRIPT_FILENAME和request_FILENAME不能包含完整的本地文件系统路径,因为在此处理阶段路径未知。在这种情况下,两个变量最初都将包含REQUEST_URI的值。为了在每个服务器上下文中获取请求的完整本地文件系统路径,请使用基于URL的前瞻%{LA-U:request_FILENAME}来确定request_FILENAME的最终值。
RewriteEngine On
RewriteCond %{LA-U:REQUEST_FILENAME} !-l
RewriteCond %{LA-U:REQUEST_FILENAME} !-d
RewriteCond %{LA-U:REQUEST_FILENAME} !-f
RewriteRule ^/images/(.*)$ /lost/index.html?image=$1 [R]