【问题标题】:.htaccess behaving differently on server.htaccess 在服务器上的行为不同
【发布时间】:2014-07-20 05:58:48
【问题描述】:

所以我有一个网站成功地将 url 参数重写为干净的 url,但在另一台服务器上相同的 .htaccess 不起作用。

<IfModule mod_rewrite.c>
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]

  RewriteCond %{HTTP_USER_AGENT} libwww-perl.*
  RewriteRule .* – [F,L]

  RewriteCond %{SCRIPT_FILENAME} !-d
  RewriteCond %{SCRIPT_FILENAME} !-f

  RewriteRule ^project/(\d+)*$ ./project.php?project=$1
</IfModule>

那里的最后一行不起作用。我需要 something.com/project/star-trek 成为用户在单击链接时获得的 url,但是在看到干净的 url 的同时提供了 something.com/project.php?project=star-trek

在 Server1 上,上面的代码可以完美运行,但在 Server2 上的相同代码却不能。 RewriteRule 确实适用于 Server2,因为我们可以使用

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

这确实可以删除 Server2 和 Server1 上的“.php”。

我确实检查了 httpd.conf 中是否允许 .htaccess,并且我已将所有 AllowOverwrite(s) 更改为 All

我在这里不知所措,希望能提供任何帮助。谢谢

【问题讨论】:

  • 除非我遗漏了什么,看起来你源代码中的href 可能是/project.php?project=star-trek ...并且因为/project.php 一个文件,它不满足RewriteConds 的-d -f 条件?
  • 没有href是/project/star-trek,但是服务器需要提供project.php?project=star-trek。就像大多数 CMS 从 index.php 中运行所有内容并根据 URL 参数对其进行更改但显示 something.com/some/page
  • 这就是我猜你想要的只是确保...^project/(\d+)*$ 不是\d 数字字符(例如 [0-9] 和 8859-1)?至少在 RegExp 和更新版本的 Apache 中;我认为 Apache 1.3 不支持完整的 Perl RegExps。
  • 哦...等一下...RewriteEngine On 行在哪里?
  • 它在 .htaccess 的早期版本中。我们正在使用 HTML5 Boilerplate .htaccess

标签: php apache .htaccess mod-rewrite httpd.conf


【解决方案1】:
<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]

    RewriteCond %{HTTP_USER_AGENT} libwww-perl.*
    RewriteRule .* – [F,L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^project/(.*?)/?$ ./project.php?project=$1 [L]
</IfModule>

这适用于我的机器,在您的原始脚本中,我注意到的位是:

  • RewriteEngine 没有打开(但它可能在 httpd.confhttpd-vhosts.conf 中)
  • RewriteRule 只匹配数字,不允许尾部斜杠:^project/(\d+)*$

我已将 RewriteRule 设为不包括尾部斜杠的不贪婪通配符匹配;在 Apache 2.4 下的 .htaccess 文件中工作。

【讨论】:

  • 我是个笨蛋...谢谢 CD001!它是\d。我将它切换到 \w 并且一切正常。我想知道为什么它可以在我的其他网站上运行,但我也会解决这个问题。
  • another note... 我做了 CD001 指出的修复,然后从 apache 收到了“禁止”消息,这导致我从 ./project.php? 中删除了“./”? .
  • 是的 - 我的 ./project.php 起初在 Firefox 上出现问题,但使用 Chrome 绝对没问题,所以我把它留在了 - 我的意思是,从逻辑上讲,它没有任何问题,*nix 文件系统和那个,但我想它在技术上是一个 URL:你会收到“禁止”消息,因为它可能试图加载类似 //mysite.com/var/www/mysite.com/htdocs/ 的东西(文件系统路径插入 URL)
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 2011-12-16
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 2013-11-19
  • 2021-01-14
相关资源
最近更新 更多