【问题标题】:Url Rewriting - Always redirecting to index.php网址重写 - 总是重定向到 index.php
【发布时间】:2012-11-18 20:24:22
【问题描述】:

我正在尝试重写一些简单的网址:

http://www.site.com/folder/index.php?page=something

进入

http://www.site.com/folder/something

这是我的 .htaccess 文件(放在 /folder/ 中)

RewriteEngine On
RewriteBase /folder
RewriteRule ^(.*)$ index.php?page=$1 [R]

有了这条规则,我总能得到这个网址

    http://www.site.com/folder/index.php?page=index.php

我做错了什么?

【问题讨论】:

    标签: php apache mod-rewrite


    【解决方案1】:

    首先,改变

    RewriteBase /folder

    RewriteBase /folder/

    二、改变

    RewriteRule ^(.*)$ index.php?page=$1 [R]

    RewriteRule ^index\.php/(.*)$ index.php?page=$1 [L,QSA]

    应该可以。 QSA 部分是允许将地址中的任何查询字符串转移到新地址;否则,它们将被丢弃。

    编辑

    在这种情况下,试试这个

    RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]

    类似于您之前的情况。
    除非您有其他模式,否则应该可以满足您的需求

    希望对您有所帮助。

    【讨论】:

    • 嗯...这不起作用。它适用于 http://www.site.com/folderhttp://www.site.com/folder/index.php 但我在写的时候出错:http://www.site.com/folder/something
    • 感谢您的提示和 Michel Feldheim,我也成功了。发布编辑问题的完整解决方案的答案。
    • 很好;请接受其中一个答案作为答案;如果可以的话,也给他们投票。谢谢。
    【解决方案2】:

    你引用了错误的匹配,像这样使用$2

    RewriteEngine On

    RewriteBase /folder

    RewriteRule ^(.*)$ index.php?page=$2 [R]

    以上内容实际上是不正确的。 . 似乎没有匹配正确的字符(我不知道为什么)。

    在不知道问题原因的情况下解决此问题的最佳方法是简单地匹配字母和数字,如下所示:

    # Turn on the rewrite engine
    RewriteEngine On
    
    # Set the rewrites for /folder
    RewriteBase /folder
    
    # Set the rewrite rules
    RewriteRule ^([a-z0-9]+)/?$ index.php?page=$1 [NC]
    

    【讨论】:

    • 嗯,已编辑,但现在我得到:site.com/folder/index.php?page= 不管我在写什么site.com/folder/something
    • @TiD91 对不起,重新阅读了我的代码,你是对的,这不起作用。一旦我正确,将在几分钟内发布编辑:-)
    • @TiD91 我已经进一步调查了这个问题,我可以看到你在哪里遇到了麻烦,因为我正在努力实现同样的目标。您是否有任何理由必须使用 RewriteBase 规则,或者您会对其他解决方案感到满意吗?
    • 我需要 RewriteBase 规则,因为如果我不设置它,我将获得网络服务器(非公共)文件夹的完整地址。 :D
    【解决方案3】:

    您的初始规则运行良好。唯一的问题是 [R] 修饰符重定向 /folder/something 到 /folder/index.php?page=something 并导致第二次请求。

    在 /folder/index.php?page=something 上应用你的规则,你会得到 /folder/index.php?page=index.php

    要修复此问题,将 [R](HTTP 302 重定向)替换为 [L](在此处匹配时离开匹配链),您就完成了

    【讨论】:

    • 对。现在除了主页外一切正常。如果我写 http://www.site.com/folder/http://www.site.com/folder/index.php 它正确地尝试重写但没有成功。那么如何避免为 index.php 重写?
    【解决方案4】:

    感谢大家,我成功地做了我想做的事:

    RewriteEngine On
    RewriteBase /folder/
    
    #Excluding direct url to php files
    RewriteCond %{REQUEST_URI} !(.*)\.php$
    #Excluding the empty space url
    RewriteCond %{REQUEST_URI} !^(\s*)$
    RewriteCond %{REQUEST_URI} !\.(gif|jpg|png|css|js|)$ [NC]
    RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]
    

    【讨论】:

      【解决方案5】:

      如果我可以建议,请查看 htaccess 的生成器,例如:http://www.generateit.net/mod-rewrite/

      给你:

      RewriteEngine On
      RewriteRule ^folder/([^/]*)$ /folder/index.php?page=$1 [L]
      

      我已经编辑了上面的内容,这是本地测试域上的一个工作示例。 也许这正是您一直在寻找的。​​p>

      另外,如果可以的话,不建议省略页面的扩展名。谷歌喜欢它是可识别的,例如.html 或 .php。

      而且,您应该为您添加的每个参数添加一个重写器。

      最后,我将省略 index.php。如果没有找到其他页面,您的服务器将自动加载 index.php,但它不必在地址栏中可见。

      【讨论】:

      • 感谢您的提示。但是有一个问题,我认为将 .htaccess 文件放在网络服务器的根目录中很好。我想把它放到 /folder/ :D
      • 在生成器上,您可以指定前缀。关键是,使用一些工具为你做这件事可能比整晚盯着它工作更好;)
      猜你喜欢
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 2012-10-15
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      相关资源
      最近更新 更多