htaccess在我添加索引之前不会加载索引

时间:2017-10-28 21:21:23

标签: php .htaccess

我正在尝试从URL中删除文件夹而我这样做了,但问题是当我访问domain.com时它显示错误500,但如果我添加domain.com/index.php它将起作用。

RewriteEngine On
RewriteBase /insta/member/

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) $1\.php [L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+insta/member/pages/([^\s]+) [NC]
RewriteRule ^ %1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (?!^insta/member/pages)^(.*)$ /insta/member/pages/$1 [L,NC]

2 个答案:

答案 0 :(得分:0)

这不是我的驾驶室,但我很确定你需要:

DirectoryIndex index.php 

在此处找到:

http://www.htaccess-guide.com/directoryindex-uses/

编辑:经过一些对话后,这可能不是问题,而是这里描述的无限循环:RewriteRule creating 500 Internal Server Error

答案 1 :(得分:0)

在这组规则中,看起来请求被视为永远是文件,如果请求文件名不是文件,则它会向其添加.php。但情况并非总是如此。在apache 2.2 mode_rewrite

  

REQUEST_FILENAME:匹配请求的文件或脚本的完整本地文件系统路径,如果在引用REQUEST_FILENAME时服务器已经确定了该路径。否则,例如在虚拟主机上下文中使用时,与REQUEST_URI

的值相同

因此,REQUEST_FILENAME可以解析为文件,文件夹或目录 (这可能因其他Web服务或其他apache版本而异)。如果是文件,规则会起作用,否则会失败。例如,//domain.com将被解析为文档根目录。但是//domain.com/index.php将被解析为文档根目录中的index.php文件。一般来说,为避免这种混淆,应考虑所有三种可能性。此外,REQUEST_FILENAME可能是一个文件,没有像//domain.com/my_styles.css这样的.php。在这种情况下,规则也会失败。 以下规则应该有效

    RewriteEngine On
    RewriteBase /insta/member/

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteCond %{REQUEST_URI} !/$
    RewriteRule (.*) $1\.php [L]

    RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+insta/member/pages/([^\s]+) [NC]
    RewriteRule ^ %1 [R=301,L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule (?!^insta/member/pages)^(.*)$ /insta/member/pages/$1 [L,NC]

修改 第一组规则的解释是它检查请求的已解析文件名部分是否不是目录,链接或文件,“filename.php”是一个文件,它不是以正斜杠结尾,然后将.php添加到请求。

回答关于漂亮网址的评论中的问题:

要实现漂亮的URL,您需要知道应用程序路由。要从查询字符串中删除GET参数,例如?checking=value,则规则应如下所示

RewriteRule (.*)/checking/(.*)$ $1?checking=$2 [L]

以下结合上述规则

    RewriteEngine On
    RewriteBase /insta/member/

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteRule (.*)/checking/(.*)$ $1\.php?checking=$2 [QSA,L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteRule (.*) $1\.php [QSA,L]

以下示例的$_GET值将为

    http://localhost/insta/member/test
    array (size=0)
      empty

    http://localhost/insta/member/test?checking=value
    array (size=1)
      'checking' => string 'value' (length=5)       

    http://localhost/insta/member/test/checking/value
    array (size=1)
      'checking' => string 'value' (length=5)

    http://localhost/insta/member/test/checking/value?second=2
    array (size=2)
      'checking' => string 'value' (length=5)
      'second' => string '2' (length=1)

最后,以下是check/ig/valuecheck?ig=value前往check.php?ig=value的具体规则

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteRule (.*)/(.*)/(.*)$ $1.\php?$2=$3 [QSA,L]

GET

的示例输出
    http://localhost/insta/member/check/ig/value
    array (size=1)
      'ig' => string 'value' (length=5)