Sep*_*eed 2 apache mod-rewrite
我很确定问题是%{REQUEST_FILENAME}没有引用已更改的 URI,而是引用了已请求的 URI。
我有一些这样的代码:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule app/?(.*)$ /some-site/map-app/$1 [NC,QSA]
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule some-site/map-app/?(.*)$ /some-site/map-app/index.html [NC,L,QSA]
</IfModule>
Run Code Online (Sandbox Code Playgroud)
效果应该是这样的
/app/some-site/map-app搜索文件时转到 ->/some-site/map-app/index.html由于某种原因,它正在重写每条后备路径index.html。这意味着#1 的发生足以满足RewriteRule条件,但由于某种原因它们RewriteCond不起作用。
如果我删除 #2 的逻辑,文件可以正常解析,因此问题不在于它生成的路径不好。
我已阅读“RewriteCond Specials”上的文档(https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html)
为什么这两个逻辑块对于第二个逻辑块内存在的路径(并且由第一个逻辑块生成)没有失败?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Run Code Online (Sandbox Code Playgroud)
一些示例和期望的结果:
/app/->/some-site/map-app/index.html/app/map/id-3->/some-site/map-app/index.html/app/app.js->/some-site/map-app/app.js/app/assets/img/1.png-> /some-site/assets/img/1.png(RewriteEngine 逻辑不包含在帖子中,但包含示例,以防它更改潜在的答案)第一次重写后,REQUEST_FILENAME服务器变量仅包含重写的 URL 路径(例如/some-site/map-app/foo),而不包含重写的 URL 将映射到的绝对文件系统路径。因此,在此阶段尝试进行文件系统检查REQUEST_FILENAME总是会失败。
需要将请求重新映射回文件系统,以便REQUEST_FILENAME将变量更新为绝对文件系统路径。这仅发生在重写引擎启动时(以及每次通过之前)。
您只需在第一条规则上包含L( ) 标志即可强制重写引擎重新启动。last这结束了当前轮的处理并将重写的URL传递回重写引擎,此时重写的URL被重新映射到文件系统并被REQUEST_FILENAME更新。
或者,不要REQUEST_FILENAME在第二条规则中使用,而是从DOCUMENT_ROOT重写的 URL 路径手动构造绝对文件名。
例如:
# If the previously rewritten URL does not map to a file (or directory)...
RewriteCond %{DOCUMENT_ROOT}/$0 !-f
RewriteCond %{DOCUMENT_ROOT}/$0 !-d
RewriteRule ^some-site/map-app(?:$|/(.*)) /some-site/map-app/index.html [NC,L]
Run Code Online (Sandbox Code Playgroud)
其中是对模式将匹配的$0整个 URL 路径的反向引用。RewriteRule
RewriteRule 您现有的正则表达式(模式)存在问题。正则表达式app/?(.*)$匹配appanything,因为斜杠是可选的,我确信这不是意图。想必您想要匹配appor app/or app/<something>?这也应该锚定到 URL 路径的开头,否则它也会匹配/some-site/map-app/<something>(这是针对第二条规则的)。这同样适用于第二条规则(上面更新)。
因此,请尝试以下操作(如果不使用L第一条规则上的标志):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^app(?:$|/(.*)) /some-site/map-app/$1 [NC]
# If the previously rewritten URL does not map to a file (or directory)...
RewriteCond %{DOCUMENT_ROOT}/$0 !-f
RewriteCond %{DOCUMENT_ROOT}/$0 !-d
RewriteRule ^some-site/map-app(?:$|/(.*)) /some-site/map-app/index.html [NC,L]
Run Code Online (Sandbox Code Playgroud)
不需要包装<IfModule>器或重复RewriteEngine指令。(查询字符串追加)标志QSA也是多余的,因为这是默认操作。我也会谨慎使用该NC标志(在内部重写时),因为这允许/app和/APP映射到相同的 URL(轻微的重复内容问题)。
我还想知道目录检查是否真的有必要?
| 归档时间: |
|
| 查看次数: |
1381 次 |
| 最近记录: |