【问题标题】:How rewriting for directory in root directory如何重写根目录中的目录
【发布时间】:2013-12-18 03:04:36
【问题描述】:

我想更改我的网址。这里我有一个这样的目录结构

htdocs/
      example/
              public/
                     login.php
                     people/
                            people1.php
                            people2.php
                     animal/
                            animal1.php
                            animal2.php
                     404.php
              assets/
                    css/
                    js/

那我要按照根目录下的现有目录来如下的url

localhost/example/login
localhost/example/people/people1
localhost/example/people/people2
localhost/example/animal/animal1
localhost/example/animal/animal2

我尝试制作一个 .htaccess 文件,其内容如下

Options +FollowSymLinks
RewriteEngine On
rewritecond %{REQUEST_URI} !^/public/(.*)
rewritecond %{REQUEST_URI} !^/assets/(.*)
RewriteRule .* index.php [L]

它是 index.php

$requested = empty($_SERVER['REQUEST_URI']) ? false : $_SERVER['REQUEST_URI'];

switch ( $requested ) {

    case '/login':
        include 'public/login.php';
        break;
    default:
        include 'public/404.php';
}

当我前往 localhost/example/login 时,但目的地是 404.php(错误)。

你能帮帮我吗?

【问题讨论】:

  • 所以你有一些rewritecond ...rewriterule 在哪里?
  • @AndyJones 你能再检查一下我的问题吗?
  • 你试过localhost/example/login?或者是其他东西?您是否在 404.php 页面中的某处转储 $_SERVER["REQUEST_URI"]
  • @AndyJones 是的,我愿意,它的价值是/self-system/login。所以我必须写有条件的,比如“case '/self-system/login'”,但只能写“case '/login'”?

标签: php apache .htaccess


【解决方案1】:

$_SERVER['REQUEST_URI'] 变量是整个 URI。所以如果要去http://example.com/example/login$_SERVER['REQUEST_URI']变量是/example/login。您可以尝试将您的 htaccess 文件更改为:

Options +FollowSymLinks
RewriteEngine On
rewritecond %{REQUEST_URI} !/public/(.*)
rewritecond %{REQUEST_URI} !/assets/(.*)
RewriteRule ^(.*)$ index.php/$1 [L]

(注意^/public/ 永远不会匹配,因为REQUEST_URI 将是/example/public

然后在您的代码中使用$_SERVER['PATH_INFO']

【讨论】:

    【解决方案2】:

    看起来您正试图隐藏优先级设置为的 PHP 扩展:

    1. 公共目录
    2. 其他地方

    将此代码放入您的DOCUMENT_ROOT/.htaccess 文件中:

    RewriteEngine On
    
    # skip for existing files/directories (/assets will be skipped here)
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^ - [L]
    
    # try to load PHP file from public directory
    RewriteCond %{DOCUMENT_ROOT}/public/$1.php -f
    RewriteRule ^(.+?)/?$ /public/$1.php [L]
    
    # now try .php elsewhere
    RewriteCond %{DOCUMENT_ROOT}/$1.php -f
    RewriteRule ^(.+?)/?$ /$1.php [L]
    

    【讨论】:

      猜你喜欢
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      相关资源
      最近更新 更多