大家好,我遇到了一台机器上的 apache mod_rewrite 配置问题。有人遇到过或解决过这些问题吗?
URL1(http://www.uppereast.com) 未被重定向至 URL2 (http://www.nyclocalliving.com)。这在我的测试环境中确实有效,其中将本地主机地址重写为 URL2 ( RewriteRule ^http://upe.localhost$http://www.nyclocalliving.com)。
我正在尝试让所有重定向规则正常工作(2200+),但是'http://www.nyclocalliving.com'如果我使用超过 1000 条规则,站点就会遇到服务器错误。
A).htaccess 文件 - 我尝试了最简单的方法,在本地环境中有效
75 # Various rewrite rules.
76 <IfModule mod_rewrite.c>
77 RewriteEngine on
78
79 # BEGIN new URL Mapping rules
80 #RewriteRule ^http://www.uppereast.com/$ http://www.nyclocalliving.com
...
2307 #RewriteRule ^http://www.uppereast.com/zipcodechange.html$ http://www.nyclocalliving.com/zip-code-change
图。1
B) /var/log/httpd/error_log 文件 - 当我启用第一条规则(第 80 行)时,出现这些 seg.fault 错误。否则没有错误日志。
1893 [Fri Sep 25 17:53:46 2009] [notice] Digest: generating secret for digest authentication ...
1894 [Fri Sep 25 17:53:46 2009] [notice] Digest: done
1895 [Fri Sep 25 17:53:46 2009] [notice] Apache/2.2.3 (CentOS) configured -- resuming normal operations
1896 [Fri Sep 25 17:53:47 2009] [notice] child pid 29774 exit signal Segmentation fault (11)
1897 [Fri Sep 25 17:53:47 2009] [notice] child pid 29775 exit signal Segmentation fault (11)
1898 [Fri Sep 25 17:53:47 2009] [notice] child pid 29776 exit signal Segmentation fault (11)
1899 [Fri Sep 25 17:53:47 2009] [notice] child pid 29777 exit signal Segmentation fault (11)
1900 [Fri Sep 25 17:53:47 2009] [notice] child pid 29778 exit signal Segmentation fault (11)
1901 [Fri Sep 25 17:53:47 2009] [notice] child pid 29779 exit signal Segmentation fault (11)
图 2
C)来自 shell 的更多调试信息;mod_rewrite 已打开,这是机器架构
1 # apachectl -t -D DUMP_MODULES | more
2 Loaded Modules:
3 core_module (static)
4 ...
5 rewrite_module (shared)
1 # uname -a
2 Linux RegionalWeb 2.6.24-23-xen #1 SMP Mon Jan 26 03:09:12 UTC 2009 x86_64 x86_64 x86_64 GNU/Linux
图 3
我查看了一些以前的帖子(.htaccess 不起作用(mod_rewrite)),但没有找到解决方案。我确信我遗漏了某个小开关。
提前致谢蒂姆
答案1
让我们从您的 Apache 配置开始。如果在 mod_rewrite 规则开始时出现段错误,则说明有些地方出了问题。您正在运行 Apache 的 RPM/DEB 版本吗?或者这是您自己编译的?
在调查您的语法问题之前,我会先排除此错误,尤其是因为它在您的本地主机上运行良好。
答案2
我不确定为什么它会出现段错误,但是,我认为你想要一条这样的规则:
RewriteRule ^zipcodechange.html$ http://www.nyclocalliving.com/zip-code-change [R=301,L]
RewriteRule ^(.*)$ http://www.nyclocalliving.com/$1 [R=301,L]
第一条规则会专门将页面写入新创建的页面并执行 301 重定向。第二条规则将获取请求的任何 URL,并将其重定向到其他网站,同时保留 URL 的页面部分。如果页面上有参数(即 pagename.html?something=else),请使用 [R=301,QSA,L]
重写规则 ^http://www.uppereast.com/$http://www.nyclocalliving.com
此时主机名/URL 不可用。我不知道规则中的 / 是否存在导致分段错误的任何问题,但我认为上述两个规则可以满足您的要求。至于分段错误,那是另一个问题。
如果建议的规则有效,我认为 mod_rewrite 解析引擎中的某些内容一定与 // 存在问题。如果上述规则仍然导致分段错误,您可能需要确保您的 apache 模块和基本版本匹配。也许您在预打包的 apache 之上重新编译了 apache,并且您的编译选项没有将模块放在相同的位置。
至于 1000 多条规则的问题,Apache 必须读取当前目录或以下目录中提供的所有内容的 .htaccess 文件,除非其中一个子目录中有一个 .htaccess 文件,并且它不包含 Inherit 语句。每次必须提供页面/资产时,可能会读取 70k 文件,某些东西超出了内存分配。您也可以将这些规则放入 apache 配置中。
答案3
如果您需要根据服务器名称/主机名控制规则,则可以编写如下规则
# simple and not really useful
RewriteCond %{HTTP_HOST} ^domain\.com
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]
# more useful
RewriteCond %{HTTP_HOST} domainA\.com
RewriteRule ^(.*)$ http://www.domainB.com/$1 [R=301,L]
# or with a more specific match
RewriteCond %{HTTP_HOST} domainA\.com
RewriteRule ^zipcodechange.html$ http://www.domainB.com/zip-code-change [R=301,L]
还要确保您的“catchall”规则位于所有特定规则的末尾...该,L
选项表示最后一条规则,这意味着 .htaccess 的其余部分将被忽略(至少对于重写而言)。