Apache 重写规则在一个子域上工作,但不在另一个子域上工作?

Apache 重写规则在一个子域上工作,但不在另一个子域上工作?,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,要设置场景,请执行以下操作: 我有两个版本的web应用程序,每个版本在自己的子域上独立运行,我们称它们为v1.mydomain.com和v2.mydomain.com。 我使用PHP和FPDF在网站上生成PDF,使用FPDF将图像插入PDF时的一个要求是图像文件名必须以.jpg或.png等结尾-它根据文件扩展名标识文件类型,而不是从内容类型头或提供的MIME类型参数。 我已经编写了一个动态PHP脚本,它可以动态生成图像,并使用FPDF将这些图像插入到我的PDF文档中。要在浏览器中访问图像,我将使

要设置场景,请执行以下操作:

我有两个版本的web应用程序,每个版本在自己的子域上独立运行,我们称它们为v1.mydomain.com和v2.mydomain.com。 我使用PHP和FPDF在网站上生成PDF,使用FPDF将图像插入PDF时的一个要求是图像文件名必须以.jpg或.png等结尾-它根据文件扩展名标识文件类型,而不是从内容类型头或提供的MIME类型参数。 我已经编写了一个动态PHP脚本,它可以动态生成图像,并使用FPDF将这些图像插入到我的PDF文档中。要在浏览器中访问图像,我将使用以下链接:

http://v1.mydomain.com/scaled.php?id=1&w=1024&h=618
其中,查询字符串中提供了生成图像所需的参数

我使用Apache.htaccess文件将以.jpg结尾的文件名路由到以下脚本:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^fpdf-scaled-(.*)-(.*)x(.*).jpg$ /scaled.php?id=$1&w=$2&h=$3
目前,这在子域v1上运行得很好,但在v2上运行得不好,在尝试查找fpdf-scaled-1-1024x618.jpg时,我得到了一个HTTP 404文件未找到错误,它告诉我,该规则尚未应用,因为它看起来不是scaled.php

托管环境PHP版本、Apache版本等完全相同,它们托管在同一台服务器上,而且两个子域之间的文件权限完全匹配

我已经花了太多的时间试图解决这个问题,希望能得到一些帮助。如果你需要任何进一步的信息,请告诉我。谢谢大家!

编辑1: 目前,所有其他行都已注释掉,因此不会影响此问题,因此我认为这对故障排除没有帮助。作为参考,完整的.htaccess将如下所示,我相信这可以更有效地编写,欢迎您对此提出意见和建议:

RewriteEngine on

# GZip compression (*.js)
RewriteCond %{REQUEST_URI} (.*)\.js
RewriteRule ^(.*\.)(js)$ gzip.php?file=$1$2 [L]

# GZip compression (*.css)
RewriteCond %{REQUEST_URI} (.*)\.css
RewriteRule ^(.*\.)(css)$ gzip.php?file=$1$2 [L]

# GZip compression (*.swf)
RewriteCond %{REQUEST_URI} (.*)\.swf
RewriteRule ^(.*\.)(swf)$ gzip.php?file=$1$2 [L]

# Exclude publicly accessible static resource folders from friendly URL rewriting
RewriteRule ^(lib|templates) - [L]

# Fpdf URL rewriting for photos
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^fpdf-scaled-([0-9]+)-([0-9]+)x([0-9]+)\.jpg$ /scaled.php?id=$1&w=$2&h=$3 [L]

# Friendly URL rewriting
RewriteCond $1 !^(index\.php|gzip\.php|scaled\.php|robots\.txt|sitemap\.xml)
RewriteRule ^(.*)$ /index.php/$1 [L]
编辑2: 子域v1的文件存储在/var/www/v1.mydomain.com中/ 子域v2的文件存储在/var/www/v2.mydomain.com中/ 服务器有许多工作虚拟主机,这两个主机都不是默认的。 忽略IP地址请求的重写日志,并将子域匿名化:

[rid#2ba56a92b108/initial] (2) init rewrite engine with requested uri /fpdf-scaled-6-1024x618.jpg
[id#2ba56a92b108/initial] (1) pass through /fpdf-scaled-6-1024x618.jpg
[rid#2ba56a92b108/initial] (2) [perdir /var/www/v2.mydomain.com/] rewrite 'fpdf-scaled-6-1024x618.jpg' -> '/scaled.php?id=6&w=1024&h=618'

有趣的是,同样的三行代码被添加到v1的重写日志中,当它完美地运行到v2时,v2不工作,唯一的区别是唯一的日志ID和子域中的数字。

尝试在规则中更加严格:RewriteRule ^fpdf scaled-[0-9]+-[0-9]+x[0-9]+\.jpg$/scaled.php?ID=$1&w=$2&h=$3[L],像我一样,别忘了逃跑。在jpg之前,不要忘记规则之后的L标志。问题:你的网址是什么http://v1.mydomain.com/scaled.php?id=1&w=1024&h=618 也可通过http://v2.mydomain.com/scaled.php?id=1&w=1024&h=618 ?我现在用限制性更强的正则表达式进行了尝试,但没有解决问题,行为保持不变。虽然我已经将这个规则隔离为导致问题的规则,但它实际上并不是最后一个将要应用的规则,这就是为什么我没有给它[L]的原因,但是尝试它仍然不能解决问题。感谢您的建议,直接访问URL时,两个URL都可以正常工作。请使用整个htaccess内容更新您的问题好的,我现在已经为您更新了问题,贾斯汀,您的子域是如何设置的?它们是否都有自己的子文件夹?这些子文件夹是否在同一级别?