【问题标题】:htaccess / rewrite rule problems... any ideas?htaccess / 重写规则问题...有什么想法吗?
【发布时间】:2012-06-20 12:59:13
【问题描述】:

在过去的 24 小时里,我一直在这里和通过搜索 google 来寻找我的问题的解决方案,但我一直找不到任何东西。抱歉,如果这在任何地方重复。

对于我网站的最后一个版本,用 php 编写,我只有一个索引页面,我使用这样的请求来获取正确的页面:

?public=view/thispage
?page=account/loggedin

我现在正在编写网站的新版本,也是在 php 中,并且我正在尝试使其具有搜索引擎友好的 urls/slugs 等示例

/page/view/thispage
/account/login

我已经设法让虚拟子域为每个客户端工作,使用下面代码的顶部,我已经设法让 slug 页面使用底部工作。

我遇到的问题是表单,例如用于注册站点、编辑用户配置文件等的表单。我在这个站点上读到,使用 apache 重写 $_POST 变量应该传递给脚本,与重定向不同,但我使用的是重写,当任何表单数据传递给 slug(例如 /profile/edit)时,它不起作用,尽管如果它传递给 virtualsubdomain.mydomain.com/test.php例子。

任何人都可以帮助我并找到一种方法来修复下面的 htaccess 文件并允许将 $_POST 变量传递给我的 slug 脚本(下面代码中的 index.php)吗?我可能只是缺少一件小事。

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.mydomainhere.org
RewriteCond %{HTTP_HOST} ^(.+).mydomainhere.org/^(.+)
RewriteRule ^([^/]*)$ http://mydomainhere.org [P,L]

ErrorDocument 404 /index.php

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /index.php
</IfModule>

我不明白为什么 post vars 可以被仅存在于虚拟子域中的 php 文件读取,但是在将它们发布到 slug(例如 /profile/editprofile)时无法读取它们。全局变量在我的服务器上已关闭,但以下只是显示默认的空白变量,因此它们显然没有被传递。

$test = ''; //define the variable to please global vars off
$test = $_POST["namehere"];
echo $test;

任何帮助将不胜感激。除了您可能知道的自定义错误文件之外,我对使用 htaccess 文件还很陌生。

【问题讨论】:

  • 恭喜你的文字墙,但请将其简化为“我的网址看起来像这样,我想改写成那样”,因为实际上没有任何非-问题中的代码文本会为问题本身添加任何内容。此外 - 不要说你的问题很紧急。每个人都认为他们的问题很紧迫。此外,我不明白为什么您认为mod_rewrite 与 PHP 的 $_POST 数组存在错误;它没有。您的问题可能出在其他地方。
  • 我已经让 url 工作了......它的 post 变量没有。我在这里添加了详细信息,就像我在这里发现的每个示例一样不工作,然后有人发布“如果你使用重写它应该”......但对我来说不是。我实际上并没有说我认为那里有错误......我说我正在做的事情不起作用,我不知道为什么这么简单地寻求帮助:(
  • 不知道原因,但是我们运行 Solaris 的客户端遇到了同样的问题 - 使用 .htaccess 重写他们无法将 POST 传递给重写/重定向的 URL,尽管 apache 应该传递 POST 转发......顺便说一句 - 将行 &lt;IfModule mod_rewrite.c&gt; 放在第一行 RewriteEngine on 之前并删除第二行 RewriteEngine on ...
  • 谢谢...这是我从两个不同的来源获得的两个不同的代码块,只是为了我自己的使用而修改过,所以我整理了一下...仍然没有成功虽然在帖子变量上:(
  • 我已经在我的服务器上进行了测试,使用您提供的确切 .htaccess 内容,我的 index.php 成功转储了 $_POST。我的猜测是您的问题与您的重写规则无关。您可以尝试删除重写并直接提交到您的index.php 文件,以排除它或您的表单有问题吗?

标签: php apache .htaccess mod-rewrite post


【解决方案1】:

我只是猜测,因为您的 .htaccess RewriteCond 和其他人有同样的问题 - 您将任何子域(www 或不包含 www. 的 URL 除外)重定向到没有 www. 的域 URL -如果我猜对了:

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.mydomainhere.org
RewriteCond %{HTTP_HOST} ^(.+).mydomainhere.org/^(.+)
RewriteRule ^([^/]*)$ http://mydomainhere.org [P,L]

然后在您的表单中,您可能在 action 属性中包含不包含 www. 的 URL,因此此操作 URL 会被重定向并且 POST 可能会丢失...

尝试使用包含www. 的网址填写您的表单action 属性:

<form method="POST" action="http://www.mydomainhere.org/my_page_to_post_to.php">

也许这会有所帮助...

【讨论】:

  • 我试过你的想法,但没有运气:(。我的表单操作是:
    因为这会加载错误页面,它需要“/profile/ editprofile" 并通过脚本运行它以确定要包含在模板中的 php 脚本,因此直接将其发送到存在的 php 文件就可以读取 post 变量,但这只是它不会的加载决定将这些变量发送到何处的 scipt。
  • 哦,我只是想到了另一件事……如果我这样做了,那么它将完全从列表中删除子域。我的脚本使用此子域来确定要加载的客户端站点以及要使用数据库中的哪些客户端数据。 client1.domain/view/news 和 client2.domain/view/news 都包含同一个文件,但根据子域的不同获取不同的数据。不过还是谢谢:)
  • @ScottD 是的,但是您可以使用http://client1.domain.com/view/newshttp://client2.domain.com/view/news 填充操作,或者在没有客户端时使用http://www.domain.com/do/something。嗯?
  • 这就是我在你建议时尝试过的......仍然没有运气。我似乎无法解决这样一个事实,即一旦它到达 apache 中的重写代码,那么所有 post 变量都会丢失。有人说没有办法,但其他人说有……我只是找不到一个:(。很多网站都使用搜索引擎友好的网址,所以必须有一些东西:(
猜你喜欢
  • 2014-07-17
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
相关资源
最近更新 更多