Ant*_*ito 5 mod-rewrite apache-2.4 centos7
场景:我需要能够重定向某些 URL 并重写其他 URL
现在经过大量的修补,我几乎可以让一切正常工作
如果我example.com
正常打工,200
如果我点击显示example.com/testrea
的文本example.com/test11/ucm25685.htm
和 200
如果我点击example.com/retest111/totest11.htm
重定向example.com/test1/ucm12347.htm
确实发生了,但是我会收到 403 Forbidden
如何阻止 403 Forbidden?我想我知道它为什么会发生,但是无法弄清楚如何阻止它。如果我禁用重写部分,重定向工作会找到并且不显示 403 forbidden。
为什么会发生 403 Forbidden,从日志中可以看出,当请求页面而不是在 RewriteMap 示例映射(rewrite.dbm)中时,它会发送/
. 我虽然将是一个缺失的索引,但是添加-Indexes
到Options
没有改变,并且/
确实有一个在 vhost 中定义的 index.htm。
问题是,如果 url 不在 RewriteMap 示例映射 (rewrite.dbm) 文件中,我在发出请求时如何不重写?
或者有没有更好的方法来混合重写和重定向,记住这仅适用于生产中的 POC,我将有几百次重写或重定向,并且 dbm 文件将随着新页面的移动而更新。
日志输出 LogLevel 警报重写:trace3
例子.com
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56079] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f697290/initial] init rewrite engine with requested uri /
[DATE] [rewrite:trace3] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56079] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f697290/initial] applying pattern '^(.*)' to uri '/'
[DATE] [rewrite:trace3] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56079] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f697290/initial] applying pattern '^(.*)' to uri '/'
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56079] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f697290/initial] rewrite '/' -> '/index.htm'
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56079] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f697290/initial] local path result: /index.htm
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56079] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f697290/initial] prefixed with document_root to /var/www/sites/me/index.htm
[DATE] [rewrite:trace1] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56079] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f697290/initial] go-ahead with /var/www/sites/me/index.htm [OK]
Run Code Online (Sandbox Code Playgroud)
example.com/testrea
[DATE] [rewrite:trace2] [pid 10407] mod_rewrite.c(470): [client 55.66.77.88:56111] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f698700/initial] init rewrite engine with requested uri /testrea
[DATE] [rewrite:trace3] [pid 10407] mod_rewrite.c(470): [client 55.66.77.88:56111] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f698700/initial] applying pattern '^(.*)' to uri '/testrea'
[DATE] [rewrite:trace3] [pid 10407] mod_rewrite.c(470): [client 55.66.77.88:56111] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f698700/initial] applying pattern '^(.*)' to uri '/testrea'
[DATE] [rewrite:trace2] [pid 10407] mod_rewrite.c(470): [client 55.66.77.88:56111] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f698700/initial] rewrite '/testrea' -> '/test11/ucm25685.htm'
[DATE] [rewrite:trace2] [pid 10407] mod_rewrite.c(470): [client 55.66.77.88:56111] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f698700/initial] local path result: /test11/ucm25685.htm
[DATE] [rewrite:trace2] [pid 10407] mod_rewrite.c(470): [client 55.66.77.88:56111] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f698700/initial] prefixed with document_root to /var/www/sites/me/test11/ucm25685.htm
[DATE] [rewrite:trace1] [pid 10407] mod_rewrite.c(470): [client 55.66.77.88:56111] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f698700/initial] go-ahead with /var/www/sites/me/test11/ucm25685.htm [OK]
Run Code Online (Sandbox Code Playgroud)
example.com/retest111/totest11.htm
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f69f2d0/initial] init rewrite engine with requested uri /retest111/totest11.htm
[DATE] [rewrite:trace3] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f69f2d0/initial] applying pattern '^(.*)' to uri '/retest111/totest11.htm'
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f69f2d0/initial] rewrite '/retest111/totest11.htm' -> '/test1/ucm12347.htm'
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f69f2d0/initial] explicitly forcing redirect with http://example.com/test1/ucm12347.htm
[DATE] [rewrite:trace1] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f69f2d0/initial] escaping http://example.com/test1/ucm12347.htm for redirect
[DATE] [rewrite:trace1] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f69f2d0/initial] redirect to http://example.com/test1/ucm12347.htm [REDIRECT/301]
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f691260/initial] init rewrite engine with requested uri /test1/ucm12347.htm
[DATE] [rewrite:trace3] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f691260/initial] applying pattern '^(.*)' to uri '/test1/ucm12347.htm'
[DATE] [rewrite:trace3] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f691260/initial] applying pattern '^(.*)' to uri '/test1/ucm12347.htm'
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f691260/initial] rewrite '/test1/ucm12347.htm' -> '/'
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f691260/initial] local path result: /
[DATE] [rewrite:trace1] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f691260/initial] go-ahead with / [OK]
Run Code Online (Sandbox Code Playgroud)
Webroot 的当前布局
test1/ucm12347.htm
test2/ucm23452.htm
test3/ucm34674.htm
test4/ucm43489.htm
test5/ucm10963.htm
test11/ucm25685.htm
test22/ucm87546.htm
test33/ucm32548.htm
test44/ucm95142.htm
test55/ucm56485.htm
/retest111/totest11.htm
/retest222/totest22.htm
/retest333/totest33.htm
/retest444/totest44.htm
/retest555/totest55.htm
Run Code Online (Sandbox Code Playgroud)
2 正在转换为 DB 和 DBM 文件的文本文件:
重写.txt
httxt2dbm -i rewrite.txt -o rewrite.dbm
/ index.htm
/testrea test11/ucm25685.htm
/testreb test22/ucm87546.htm
/testrec test33/ucm32548.htm
/testred test44/ucm95142.htm
/testree test55/ucm56485.htm
Run Code Online (Sandbox Code Playgroud)
重定向.txt
httxt2dbm -f db -i redirects.txt -o redirects.db
/retest111/totest11.htm test1/ucm12347.htm
/retest222/totest22.htm test2/ucm23452.htm
/retest333/totest33.htm test3/ucm34674.htm
/retest444/totest44.htm test4/ucm43489.htm
/retest555/totest55.htm test5/ucm10963.htm
Run Code Online (Sandbox Code Playgroud)
在 httpd.conf 我有一个全局重写
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteMap examplemap "dbm:/etc/httpd/conf/rewrite.dbm"
RewriteRule ^(.*) /${examplemap:$1}
</IfModule>
Run Code Online (Sandbox Code Playgroud)
和一个单独的虚拟主机
<VirtualHost *:80>
DocumentRoot /var/www/sites/me
ServerName example.com
DirectoryIndex index.htm
ErrorDocument 404 /index.php
Options +FollowSymLinks
RewriteEngine On
RewriteOptions Inherit
RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.db
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*) /${redirects:$1} [redirect=permanent,last]
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
我认为 403 被触发是因为您的DirectoryIndex
文档(即index.htm
)不存在。然而,这只是真正的潜在问题的最终结果......您无条件地重写示例映射 的返回值RewriteMap
(可能是“空”)。我怀疑如果您直接请求或examplemapexample.com/test1/ucm12347.htm
中不存在的任何 URL,您会看到相同的结果。 RewriteMap
当在您的examplemap 中找不到查找(在每个不重定向的RewriteMap
请求上查找)时,您最终会重写到(文档根),因为从重写映射返回的结果为空。这将触发 mod_dir 来服务. 如果该文档不存在并且该选项未启用,那么您将收到 403 Forbidden。/
DirectoryIndex
DirectoryIndex
Indexes
您通过创建 RewriteMap
一个首先检查RewriteMap
. 您需要对examplemap RewriteMap
执行类似的操作。例如:
RewriteMap examplemap "dbm:/etc/httpd/conf/rewrite.dbm"
RewriteCond ${examplemap:$1} !=""
RewriteRule ^(.*) /${examplemap:$1} [L]
Run Code Online (Sandbox Code Playgroud)
选择:
Run Code Online (Sandbox Code Playgroud)RewriteCond ${redirects:$1} !="" RewriteRule ^(.*) /${redirects:$1} [redirect=permanent,last]
您可以将查找结果存储RewriteMap
在环境变量中,以避免多次查找(在条件和替换RewriteRule
中)。尽管查找的结果RewriteMap
被缓存,所以这可能看不到任何好处。例如:
RewriteRule (.*) - [E=REDIRECT_TO:${redirects:$1}]
RewriteCond %{ENV:REDIRECT_TO} .
RewriteRule ^ /%{ENV:REDIRECT_TO} [redirect=permanent,last]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
242 次 |
最近记录: |