【问题标题】:Having some issues with htaccess mod rewritehtaccess mod rewrite有一些问题
【发布时间】:2016-12-30 20:10:38
【问题描述】:

大家好,想知道我是否可以挑选你的大脑并且尽可能描述性。

所以我正在尝试创建一个页面,该页面将根据用户选择的选择加载标题和类别(来自数据库的动态)

站点名称用作我的域名

为了更清楚一点,我有一个名为 sitename/2017/slot.php?gp=category&sn=title 的文件和变量

类别和标题存储在数据库中的每一行我想要做的是创建一个干净的 URL 看起来像这个 sitename/2017/slot/category/title/

因此,当查看像这样 sitename/2017/slot.php?gp=category&sn=title 这样的页面时,页面会加载所有内容并正确显示,并且正在设置变量,因为我可以在浏览器选项卡的标题中看到它们

当我使用 mod 重写使其干净时,我的错误出现了,一旦 .htaccess 已更改并上传,我导航到新的干净 URL sitename/2017/slot/category/title/ 它向我显示变量没有已设置,因为它们不再出现在浏览器的标题选项卡中,并且该页面也没有使用我的 CSS。下面我添加了我的 htaccess 规则,非常感谢任何帮助和反馈

#change this sitename/2017/slot.php?gp=category&sn=title
#to this sitename/2017/slot/category/title/
Options +FollowSymLinks
RewriteEngine on
RewriteRule ^slot/([a-z-]+)/([a-z-]+)/ slot.php?gp=$1&sn=$2 [NC,L]

只是以防万一这是我在 slot.php 中使用的 php 代码,我正在连接到我的数据库,那里没有问题,并且在下面的代码运行 while 循环以获取用户单击的行的数据之后

p>
if($_GET['gp'] && $_GET['sn']){
    $gp = preg_replace('#[^a-zA-Z-]#i', '', $_GET['gp']);
    $sn = preg_replace('#[^a-zA-Z-]#i', '', $_GET['sn']);
}

这是我的 htaccess 中的完整代码

#make custom page not found
#ErrorDocument 404 /filenotfound.php

#stop directory file listing in all folders
IndexIgnore *

#make pages have www. in them
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.org
RewriteRule ^(.*)$ http://www.example.org/$1 [R=permanent,L]

#change this slot.php?gp=category&sn=title
#to this sitename/2017/slot/category/title/
Options -MultiViews +FollowSymLinks
RewriteRule ^slot/([a-z-]+)/([a-z-]+)/ /2017/slot.php?gp=$1&sn=$2 [R=302]

【问题讨论】:

  • 例如域请使用example.comsitename 在这种情况下是模棱两可的,因为它可以被视为一个子目录。 (因此下面有些混乱。)
  • @w3dk 我是新成员,它不允许我发布任何类型的域名,这就是我写问题时它告诉我的内容,所以不得不求助于网站名称
  • 编辑器不允许您发布多个外部链接。要发布示例 URL,请将它们用反引号括起来(内联代码格式) - 如果采用这种格式,则没有限制。
  • @w3dk 好的,谢谢,请注意,以备将来参考
  • 这个.htaccess 文件在哪里?您的代码暗示它在/2017 子目录中(这是一个物理目录)?但是,到目前为止,答案是假设它在文档根目录中?

标签: php apache .htaccess mod-rewrite


【解决方案1】:

如果您的 URL 以 2017 开头,则必须将其包含在您的 RewriteRule 中。

RewriteRule ^2017/slot/([a-z-]+)/([a-z-]+)/ slot.php?gp=$1&sn=$2 [NC,L]

【讨论】:

  • 你能解释一下什么是“相同的结果”吗?
  • 相同的结果是我的 php 页面中没有设置变量并且没有使用 css,就好像你取出 mod 重写并使用原始 slot.php?gp=category&sn=title 一样工作正常,变量已设置并且 css 正在工作
  • css 是因为您(可能)使用了相对路径(而不是绝对路径),所以浏览器在 sitename/2017/slot/category/title/style.css(而不是 sitename/style.css)内寻找 style.css 文件。关于 PHP 中的变量 - 我不明白你做了什么。
  • 好的,我理解 CSS 的原因。关于 PHP 变量,请查看原始帖子,我已使用 slot.php 页面中的 PHP 代码对其进行了更新
  • 尝试添加var_dump($_GET);之前你到达那里的if
【解决方案2】:

您误用了^,它匹配路径的最开始(sitename/ 之后的部分。也就是说,以^slot/ 开头的规则将仅匹配sitename/slot/,而不匹配sitename/2017/slot/。您的规则应如下所示:

#change this sitename/2017/slot.php?gp=category&sn=title
#to this sitename/2017/slot/category/title/
RewriteRule ^2017/slot/([a-z-]+)/([a-z-]+)/ slot.php?gp=$1&sn=$2 [NC,L]

【讨论】:

  • 好的,所以我尝试了你的建议,但我仍然有同样的问题,一旦使用 mod rewrite,如果我将它恢复到原始 url,则不会收到任何变量,然后再次找到并使用 get 变量该页面未使用为该页面设置的 css
  • 您是要定向到 sitename/2017/slot.php 还是 sitename/slot.php?如果是前者,则规则两部分都需要2017:RewriteRule ^2017/slot/([a-z-]+)/([a-z-]+)/ 2017/slot.php?gp=$1&sn=$2 [NC,L]
  • 我刚刚更改了 htaccess 以匹配您的新建议,但仍然没有
【解决方案3】:

我可以参加聚会吗?

RewriteRule ^sitename/2017/slot/([a-z-]+)/([a-z-]+)/ /slot.php?gp=$1&sn=$2 [NC,L]

如果sitename这个域名,我的答案会改成:

RewriteRule ^2017/slot/([a-z-]+)/([a-z-]+)/ /slot.php?gp=$1&sn=$2 [NC,L]

这与 Dekel 的几乎相同,但不完全一样:)

【讨论】:

  • @Dusan Bajic 欢迎参加派对 :) 我会试试你的做法,如果失败与否,我会在 2 分钟内通知你
  • @Dekel 那是哪一个,我找不到完全相同的?
  • @Dusan Bajic 仍然无法正常工作,希望每个人都能看到这个站点名是我的域名,我只是不允许将域名发布两次以上,所以为了简单起见,将其保留为站点名
  • @DusanBajic 抱歉,你把sitename 放在那里不太好(这是错误的,顺便说一句。域不应该是RewriteRule 的一部分。
  • 哦,那是域名?我以为这只是 URI 路径 :)
【解决方案4】:
#example.com/2017/slot.php?gp=category&sn=title
#example.com/2017/slot/category/title/

您需要禁用 MutliViews。 .htaccess 文件顶部附近:

Options -MultiViews

启用 MultiViews(mod_negotiation 的一部分)/2017/slot 被隐式重写为 /2017/slot.php(不带任何查询字符串参数)您的 mod_rewrite 指令正在处理之前。


虽然目前还不清楚您的.htaccess 文件的位置。所以,可能还有一些工作要做……如果你的.htaccess 文件位于example.com/2017/.htaccess,那么你现有的 mod_rewrite 指令就足够了。

但是,如果您的.htaccess 文件位于文档根目录中(即example.com/.htaccess),那么您将需要修改您的RewriteRule

RewriteRule ^2017/slot/([a-z-]+)/([a-z-]+)/ 2017/slot.php?gp=$1&sn=$2 [NC,L]

【讨论】:

  • 所以,您现有的 mod_rewrite 指令应该没问题。如上所述,您只需要禁用MultiViews。确保清除浏览器缓存等。运气好吗?
  • 是的,禁用了多视图,清除了我的缓存,仍然没有结果
  • 这是 Apache,但您的站点正在从 Nginx 服务器响应...您是否使用 Nginx 作为前端代理?
  • 听起来很愚蠢,但我怎么知道,我通过 hostmonster 使用托管服务
  • 嗯,看起来确实像你。不确定这到底是如何影响事物的;它肯定增加了另一层复杂性。顺便说一句,您是否尝试过上述临时重定向?是的,您的服务器正在运行 Apache,但 Nginx 服务器位于前端代理对 Apache 后端服务器的请求。然后最终从 Nginx 服务器返回响应。 (也就是说,除非 Apache 服务器设置了Server:nginx/1.10.2 HTTP 响应头!?)
猜你喜欢
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 2013-11-15
相关资源
最近更新 更多