【问题标题】:Mod Rewrite Slash ProblemMod重写斜线问题
【发布时间】:2023-04-05 21:31:01
【问题描述】:

我在网站上搜索了这个问题,但找不到解决方案。

我有一个php页面,调用 http://www.domain.com/topic.php?name=xyz

我想调用这个页面 http://www.domain.com/topic/xyz

我尝试的是;

重写引擎开启

重写规则 ^topic/([^/]*)$ /topic.php?name=$1 [L]

但是由于这个“/”,我得到 404 错误。如果我尝试“-”而不是“/”,它会起作用。我猜“/”将用户转发到文件夹“/topic”,所以我需要一个解决方案来修复它。

【问题讨论】:

  • 代码中的第一个。当我调用 ...com/topic/xyz 时,它会指向“主题”文件夹并返回 404。
  • 你的规则对我来说很好。文件topic.php 是否实际存在于根文件夹中? .htaccess 是否位于根文件夹中?

标签: php regex mod-rewrite


【解决方案1】:

鉴于您的主题名称遵循模式([a-zA-Z0-9-_]+),以下内容应该有效 - 如果它不匹配它,它可能应该(并且您的工作是对其进行清理以使其匹配),因为它是网址。

RewriteEngine On
RewriteRule ^topic/([a-zA-Z0-9-_]+).html$ topic.php?name=$1 [L]

注意:

在您的请求中,您说您希望 url 看起来像这样:http://www.domain.com/topic/xyz,并且在 .htaccess 规则中,您尝试在末尾使用 .html 编写它。如果您不想在最后使用.html,您应该执行以下操作:

RewriteEngine On
RewriteRule ^topic/([a-zA-Z0-9-_]+)$ topic.php?name=$1 [L]

【讨论】:

  • 我尝试过,但我仍然遇到同样的错误。我在想它是否与“AllowEncodedSlashes on”命令有关。
  • 在这种情况下[a-zA-Z0-9-_][^/] 之间没有显着差异。你也错过了*(或+)量词。
  • @zerkms 我刚刚看到我错过了+,所以它只会匹配一个字符。自我提醒:困时不要回答 SO :)
【解决方案2】:

我找到了解决问题的方法。虽然有点晚了:)

我编辑我的 .htaccess 这样

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule .* redirect.php [L] 

如您所见,我创建了一个redirect.php。在这个文件中,我分解斜线,然后使用我设置的 if 语句

$path =  explode("/", $_SERVER['REQUEST_URI']);
switch ($path[1])
{
    case 'topic': $_GET[name]=$path[2]; include('topic.php'); break;
}

正如您所见,将 $_GET 设置为代码并不美观,但它的作用就像一个魅力! :) 谢谢大家的帮助。

【讨论】:

    【解决方案3】:

    无聊到猜不透了。

    我的 .htaccess(取自您的问题):

    RewriteEngine on
    RewriteBase /
    RewriteRule ^topic/([^/]*)$ /topic.php?name=$1 [L]
    

    我的topic.php:

    <?php
    
    var_dump($_GET);
    

    请求:

    http://localhost/topic/xyz
    

    结果:

    array(1) { ["name"]=> string(3) "xyz" }
    

    所以它只适用于Apache 2.2.14

    【讨论】:

      【解决方案4】:

      我认为您需要将正斜杠隔开,如下所示:

      RewriteRule ^topic\/([^\/]*)$ topic.php?name=$1 [L]
      

      在 Bogdan 的解决方案中,您在字符类之后缺少一个 +,现在它只匹配一个字符:P

      【讨论】:

      • 还是404。问题与括号中的/无关,是第一个。
      • 为什么需要他? / 在 mod_rewrite 中没有任何特殊含义。
      • 因为如果我将代码修复为“RewriteRule ^topic-([^\/]*)$ /topic.php?name=$1 [L]” 那么 www.domain.com/topic- xyz 有效。
      • 如果您也转义另一个正斜杠,它是否有效? (更新了我的帖子)。
      • / 此处未用作分隔符,因此您不必转义它。
      【解决方案5】:

      如果您的httpd.conf 中有AddHandler type-map var 行,请尝试将其注释掉。

      这可能看起来很奇怪,但这个功能(不经常使用,但在 Apache “It Worked!”页面的默认 httpd.conf 中启用)过去曾让我感到悲痛。

      这与您有一个文件“topic.php”这一事实有关,Apache 允许您将其称为“topic/en-us”。或者类似的东西。您必须look up the feature in the Apache docs 才能获得详细信息;我只是要失忆了。

      【讨论】:

      • 我正在使用 GoDaddy。所以我没有希望,也许我应该接受我不能在我的网址中使用 / 的事实。
      • 感谢警告 :) 我会尽快逃跑的。
      • @Kenshi:你会因此获得 +1
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多