【问题标题】:Internal URL rewrite no longer working after upgrading Apache to 2.4将 Apache 升级到 2.4 后,内部 URL 重写不再起作用
【发布时间】:2013-11-30 04:12:53
【问题描述】:

我需要在内部重写基本 URL,以便将 / 映射到 /index.php(默认行为)而不是映射到另一个名为 contents.php 的脚本。我在文档根目录中有一个简单的 .htaccess:

RewriteEngine on
RewriteRule ^/?$ /contents.php?id_cat=0 [L]

这在 Apache 2.2 中运行良好,但不再适用于 Apache 2.4.6。现在它被简单地忽略了,默认情况下会调用 /index.php 脚本。

但是,如果我添加 Relocate 标志:

RewriteEngine on
RewriteRule ^/?$ /contents.php?id_cat=0 [R,L]

...它确实有效,但它暴露了我不想要的重写的 URL。

我尝试使用 PT(直通)标志 [PT,L][END],但没有成功。

我错过了什么?

编辑:我为重写启用了跟踪日志记录,这就是我为 single 请求得到的结果:

[Sat Nov 16 17:43:22.021036 2013] [rewrite:trace3] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b67b0a0/initial] [perdir /var/www/bacityapartments/] strip per-dir prefix: /var/www/bacityapartments/
->
[Sat Nov 16 17:43:22.021075 2013] [rewrite:trace3] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b67b0a0/initial] [perdir /var/www/bacityapartments/] applying pattern '^/?$' to uri ''
[Sat Nov 16 17:43:22.021087 2013] [rewrite:trace2] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b67b0a0/initial] [perdir /var/www/bacityapartments/] rewrite '' -> '/contents.php?id_cat=0'
[Sat Nov 16 17:43:22.021096 2013] [rewrite:trace3] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b67b0a0/initial] split uri=/contents.php?id_cat=0 -> uri=/contents.php, args=id_cat=0
[Sat Nov 16 17:43:22.021111 2013] [rewrite:trace1] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b67b0a0/initial] [perdir /var/www/bacityapartments/] internal redirect with /contents.php [INTERNAL REDIRECT]
[Sat Nov 16 17:43:22.021197 2013] [rewrite:trace3] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b6790a0/subreq] [perdir /var/www/bacityapartments/] strip per-dir prefix: /var/www/bacityapartments/in
dex.html -> index.html
[Sat Nov 16 17:43:22.021208 2013] [rewrite:trace3] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b6790a0/subreq] [perdir /var/www/bacityapartments/] applying pattern '^/?$' to uri 'index.html'
[Sat Nov 16 17:43:22.021218 2013] [rewrite:trace1] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b6790a0/subreq] [perdir /var/www/bacityapartments/] pass through /var/www/bacityapartments/index.html
[Sat Nov 16 17:43:22.021268 2013] [rewrite:trace3] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b6740a0/subreq] [perdir /var/www/bacityapartments/] strip per-dir prefix: /var/www/bacityapartments/in
dex.cgi -> index.cgi
[Sat Nov 16 17:43:22.021290 2013] [rewrite:trace3] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b6740a0/subreq] [perdir /var/www/bacityapartments/] applying pattern '^/?$' to uri 'index.cgi'
[Sat Nov 16 17:43:22.021299 2013] [rewrite:trace1] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b6740a0/subreq] [perdir /var/www/bacityapartments/] pass through /var/www/bacityapartments/index.cgi
[Sat Nov 16 17:43:22.021345 2013] [rewrite:trace3] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b6790a0/subreq] [perdir /var/www/bacityapartments/] strip per-dir prefix: /var/www/bacityapartments/in
dex.pl -> index.pl
[Sat Nov 16 17:43:22.021355 2013] [rewrite:trace3] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b6790a0/subreq] [perdir /var/www/bacityapartments/] applying pattern '^/?$' to uri 'index.pl'
[Sat Nov 16 17:43:22.021364 2013] [rewrite:trace1] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b6790a0/subreq] [perdir /var/www/bacityapartments/] pass through /var/www/bacityapartments/index.pl
[Sat Nov 16 17:43:22.021389 2013] [rewrite:trace3] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b6740a0/subreq] [perdir /var/www/bacityapartments/] strip per-dir prefix: /var/www/bacityapartments/in
dex.php -> index.php
[Sat Nov 16 17:43:22.021398 2013] [rewrite:trace3] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b6740a0/subreq] [perdir /var/www/bacityapartments/] applying pattern '^/?$' to uri 'index.php'
[Sat Nov 16 17:43:22.021407 2013] [rewrite:trace1] [pid 5895] mod_rewrite.c(468): [client 127.0.0.1:55297] 127.0.0.1 - - [bacityapartments.localhost/sid#7f7e3b748400][rid#7f7e3b6740a0/subreq] [perdir /var/www/bacityapartments/] pass through /var/www/bacityapartments/index.php
00

因此正在执行重写,但随后它就像没有执行一样继续进行。

编辑 2: 如果我将此规则移至虚拟主机配置文件,它会按预期工作。更多信息可以在here找到。

此外,此问题仅发生在目录本身。例如,如果我将 /hello 重写为 /contents.php?msg=hello,它在 .htaccess 中也可以正常工作。

【问题讨论】:

  • 您在错误日志中发现了什么吗?是否在服务器配置中激活了 mod rewrite 模块?
  • 没有错误。 Mod_rewrite 已启用(这就是添加 R 标志确实有效的原因)并且还设置了 AllowOverride All 指令和 FollowSymLinks 指令。
  • 你的 .htaccess 文件被 apache2 忽略了?
  • @jacouh 不,他们没有被忽略。阅读我发布的信息,您会看到正在重写但随后被忽略。

标签: apache .htaccess mod-rewrite


【解决方案1】:

这是一个已知的bug in Apache 2.4。我使用了workaround provided here,它现在可以工作了。

【讨论】:

  • 拯救我的一天!几乎相同的问题stackoverflow.com/questions/25527411/…
  • 出于好奇,您是如何设法找到发布在 apache bugzilla 上的这个错误的?我花了好几个小时在谷歌上搜索,但没有运气......
  • @AmareKnight 我想我用谷歌搜索了“Apache 2.4 bug rewrite broken”之类的东西,但我不能确定。确实,在 Bugzilla 中查找现有错误并不容易。
  • 在这上面花了几个小时...谢谢
【解决方案2】:

我遇到了 SEO 链接问题(确切地说是 Prestashop 网站)。选项是添加

AllowOverride All 

在虚拟主机的目录中:

    <Directory /srv/path_to_public/public_html/>
            AllowOverride All
    </Directory>

来自 apache 文档:

http://httpd.apache.org/docs/current/mod/core.html#allowoverride AllowOverride None(2.3.9 及更高版本)、AllowOverride All(2.3.8 及更早版本)

【讨论】:

  • 请注意,设置允许的 AllowOverride 指令可能会导致安全问题,具体取决于您的站点脚本的编写方式以及不同用户的访问权限:serverfault.com/questions/224078/…
  • 文档根目录块中的“AllowOverride All”对我有用。
  • 在 ubuntu 上使用 apache2.conf 文件夹“/var/www/”中的 apache 2.4 设置为 AllowOverride None。如果您的文档根目录是 /var/www/ 中的文件夹,则在站点配置中您必须使用 AllowOverride All 覆盖它。否则,您的 .htaccess 根本无法正常工作。感谢您的提示
【解决方案3】:

升级到 Apache 2.4.6 后,我在虚拟主机上也有 404 的 WordPress 重定向

在我的情况下,问题是通过将每个虚拟主机目录配置的“AllowOverride None”更改为“AllowOverride FileInfo”来解决的。

【讨论】:

    【解决方案4】:

    我也偶然发现了这个非常烦人的问题。解决方法是禁用httpd.conf中的MultiViews,为需要的目录添加-MultiViews,例如:

    <Directory /home/example.com/public_html>
        Options -Indexes -MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    

    在那之后,重写开始以预期的方式工作。

    编辑配置文件后不要忘记重新加载 Apache。

    【讨论】:

    • @FabianThommen 你错了,Fabian!如果您在本地.htaccess 中在其中一个目录上设置了-MultiViews,那么您所说的只会给您带来任何影响。你说的指令,只会让使用.htaccess 覆盖。再想想!
    • 好的,抱歉,我重读了这个问题并删除了我的评论并收回了我的反对票。
    【解决方案5】:

    就我而言,我是从 debian 8 (jessie) 升级到 9 (stretch)。

    我一定是错误地覆盖了我以前的/etc/apache2/apache2.conf 版本。

    解决方案是改变它(在/etc/apache2/apache2.conf 内):

    <Directory /var/www/>
            Options Indexes FollowSymLinks
            AllowOverride None
            Require all granted
    </Directory>
    

    进入这个:

    <Directory /var/www/>
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
    </Directory>
    

    ...它神奇地修复了该机器上安装的每个 PHP 站点的所有重写问题 :)

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 2015-02-13
      • 2015-08-16
      • 2018-03-11
      • 2014-12-17
      • 2017-11-14
      • 2010-12-09
      • 2015-08-31
      • 1970-01-01
      相关资源
      最近更新 更多