损坏的 apache .htaccess (mod_rewrite)

损坏的 apache .htaccess (mod_rewrite)

大家好,我遇到了一台机器上的 apache mod_rewrite 配置问题。有人遇到过或解决过这些问题吗?

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 的其余部分将被忽略(至少对于重写而言)。

相关内容