【问题标题】:How to re-write the link, with ".htaccess", in a sub-folder?如何在子文件夹中使用“.htaccess”重写链接?
【发布时间】:2016-08-18 13:16:59
【问题描述】:

我有这个网站,结构如下:http://example.com/-/?id=1234。现在,我想将此链接编辑为:http://example.com/-/1234


所以,我在http://example.com/-/ 中添加了一个.htaccess;有内容:

RewriteEngine On
RewriteRule ^/?-/([0-9]+)$ /index.php?id=$1

不幸的是,它总是显示:Error - 500


我的.htaccess 有什么问题?


我的问题与任何现有问题重复...

【问题讨论】:

标签: php apache .htaccess


【解决方案1】:

这是子文件夹的 htaccess

<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine on
    RewriteBase /foldername
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?$1 [L]
</IfModule>

【讨论】:

  • 但它在godaddy上对我有用。请再次正确检查。
  • @YeuSeChia 404 错误代码存在于它与重写规则指定的新位置的服务器上存在的文件不匹配时。所以检查一下,仔细检查一下
  • 是的,它会尝试匹配您的函数中没有参数的路线,因此会出现错误 404。请先尝试更正您的路线。 ?id=1234 不是路由请求,而是 /1234 对于此请求,您应该定义路由
【解决方案2】:

您可以在/-/.htaccess 中使用以下规则

RewriteEngine on
RewriteRule ^/?([0-9]+)$ /-/?id=$1 [L]

【讨论】:

  • 检查您的服务器错误日志以获取有关 500error 的信息,这不是由于重写规则造成的。
  • ...这是我大约半小时前得出的结论;)我想只有陷阱可能是一个递归重写循环-尽管应该508
【解决方案3】:

这应该可行:

RewriteEngine On
RewriteRule ^-/([0-9]+)$ /-/?id=$1

它在我的测试服务器 ( Apache/2.4.6 ) 上正确重写,这是重写跟踪日志(为清楚起见,打开了重定向):

[rewrite:trace2]  init rewrite engine with requested uri /-/1234
[rewrite:trace1]  pass through /-/1234
[rewrite:trace3]  add path info postfix: /var/www/html/example.com/- -> /var/www/html/example.com/-/1234
[rewrite:trace3]  strip per-dir prefix: /var/www/html/example.com/-/1234 -> -/1234
[rewrite:trace3]  applying pattern '^-/([0-9]+)$' to uri '-/1234'
[rewrite:trace2]  rewrite '-/1234' -> '/-/?id=1234'
[rewrite:trace3]  split uri=/-/?id=1234 -> uri=/-/, args=id=1234
[rewrite:trace2]  explicitly forcing redirect with http://example.com/-/
[rewrite:trace1]  escaping http://example.com/-/ for redirect
[rewrite:trace1]  escaping id=1234 to query string for redirect id=1234
[rewrite:trace1]  redirect to http://example.com/-/?id=1234

【讨论】:

    【解决方案4】:

    根据你写的目录结构是这样的:

      "/" (root)
       |
       |___ "-" (directory)
             |
             |___ .htaccess
             |___ index.php
    

    然而 RewriteRule 是这样的:

    RewriteRule ^/?-/([0-9]+)$ /index.php?id=$1
    

    使用您指定的目录结构,除非您请求像 http://www.example.com/-/-/123 这样的 URL(注意 2 级连字符),否则该规则永远不会匹配。这是因为.htaccess 使用的路径是相对于文件所在的位置,并且您已声明它位于名为"-" 的目录中。前导斜杠将将匹配的 URL 跳转到根目录,并且因为您已经允许它 0 或 1 次 (?) 它只会被忽略,因此实际上它正在寻找一个目录从名为 "-" 的目录中调用 "-"

    然后,如果您查看您的重写实际去向,它不是/-/index.php,而是去/index.php(域的根);领先的/在重写时生效。

    该规则几乎是有意义的如果您的索引和 .htaccess 文件在 docroot 中:

      "/" (root)
       |
       |___ .htaccess
       |___ index.php
    

    ...并且那个 "-" 目录实际上并不存在,但它只是用作 URL 中的重写触发器。

    在这种情况下,您的 RewriteRule 应该是:

    RewriteRule ^-/([0-9]+)$ /index.php?id=$1
    

    但是这些都不会导致 HTTP 500 错误 - 您在某个地方还有一个未向我们展示的问题。

    【讨论】:

      【解决方案5】:

      根据您的要求,这是您的服务器结构:

      “/”(根)
      |
      |___“-”(目录)
      |
      |___ .htaccess
      |___ 索引.php

      在创建.htaccess 文件之前,请检查您的服务器配置。

      RewriteEngine On
      RewriteRule ^([0-9]+)$ ?x=$1

      【讨论】:

        猜你喜欢
        • 2013-11-13
        • 2015-04-22
        • 2021-09-16
        • 2015-09-27
        • 2016-05-20
        • 1970-01-01
        • 1970-01-01
        • 2016-12-21
        • 2012-12-12
        相关资源
        最近更新 更多