【问题标题】:How to setup URL paths conveniently, making them different from absolute ones?如何方便地设置 URL 路径,使其与绝对路径不同?
【发布时间】:2018-02-05 15:09:49
【问题描述】:

这是我迄今为止关于 Stack Overflow 的第一个问题。

我提供了这么多信息,因为我觉得我从一开始就走错了路,所以可能有更好的解决方案/方法,只使用 PHP。

信息

我的本​​地 XAMPP 服务器上有一个网站,可以使用http://localhost/project/ 访问它。

我的项目结构如下:

|-- htdocs/
|---- project/
|------ css/
|------ img/
|------ js/
|------ less/
|------ files/
|------ src/
|-------- _config/
|---------- config.php
|-------- _template/
|---------- header.php
|---------- footer.php
|-------- pages/
|---------- portfolio/
|------------ showcase1.php
|------------ showcase2.php
|---------- company.php
|---------- contacts.php
|---------- portfolio.php
|------ .htaccess
|------ index.php

我需要什么

网址应如下所示:

  1. http://localhost/project/ - 根文件夹、索引、主页
  2. http://localhost/project/company - 显示位于http://localhost/project/src/pages/company.php 的网页
  3. http://localhost/project/portfolio/showcase1 - 显示位于 http://localhost/project/src/pages/portfolio/showcase1.php 的网页

我有什么

我已成功满足上述“我需要什么”列表中的第 1 项和第 2 项要求,但是我无法完成第 3 项工作。

.htaccess:

RewriteEngine on
RewriteBase /
RewriteRule ^(\w+)$ /project/src/pages/$1.php [L,NC]

PHP:

每个 somepage.php 文件包含:

<?php require_once($_SERVER['DOCUMENT_ROOT']."/project/src/_template/header.php");?>

header.php

<?php require_once($_SERVER['DOCUMENT_ROOT'].'/project/src/_config/config.php'); ?>
<!doctype html>
<head>
...
<base href="<?php echo SER_NAME; ?>">
...
</head>
<body>
    ...
    <nav id="menu">
        <a href="company">Company</a>
        <a href="portfolio">Portfolio</a>
        <a href="portfolio/showcase1">Schowcase1</a>
        <a href="portfolio/showcase2">Schowcase2</a>
        <a href="contacts">Contacts</a>
    </nav>
    ...

config.php

<?php 
$basedir = '/project/';
define('DOC_ROOT', $_SERVER['DOCUMENT_ROOT'] . $basedir);
define('SER_NAME', "//" . $_SERVER['SERVER_NAME'] . $basedir);
define('TEMPLATE', DOC_ROOT . 'src/_template');
define('CSS_PATH', SER_NAME . 'css');
define('JS_PATH', SER_NAME . 'js');
define('IMG_PATH', SER_NAME . 'img'); 
define('FILE_PATH', SER_NAME . 'files');
?>

问题

  1. 如何从上面的“我需要的东西”列表中获得第 3 项?我的情况需要什么 .htaccess 规则?
  2. 如果我走错了路,哪种解决方案/方法可能更好?

【问题讨论】:

    标签: php apache .htaccess url url-rewriting


    【解决方案1】:

    您的规则会有些混乱,因为投资组合既是文件夹又是 php 脚本。第一件事可能是添加一个重写条件,以便规则不会被应用,除非 php 文件实际存在(这不会解决 #3)

    RewriteEngine on
    RewriteBase /
    
    RewriteCond %{REQUEST_URI} ^/project/(\w+)$
    RewriteCond %{DOCUMENT_ROOT}/project/src/pages/%1.php -f
    RewriteRule ^(\w+)$ /project/src/pages/$1.php [L,NC]
    

    -f 检查文件是否存在。如果有人在浏览器的地址栏中键入此内容,您可能想要这样做:

    http://localhost/project/blahblah
    

    他们会得到一个 404 响应,说“/project/src/pages/blahblah.php 不存在”,这揭示了您项目的内部路由。

    然后,这条规则之前,你需要一些特殊的东西来路由到投资组合文件夹:

    RewriteEngine on
    RewriteBase /
    
    RewriteCond %{REQUEST_URI} ^/project/portfolio/(\w+)$
    RewriteCond %{DOCUMENT_ROOT}/project/src/pages/portfolio/%1.php -f
    RewriteRule ^portfolio/(\w+)$ /project/src/pages/portfolio/$1.php [L,NC]
    
    RewriteCond %{REQUEST_URI} ^/project/(\w+)$
    RewriteCond %{DOCUMENT_ROOT}/project/src/pages/%1.php -f
    RewriteRule ^(\w+)$ /project/src/pages/$1.php [L,NC]
    

    【讨论】:

    • 非常感谢您的回复!对此,我真的非常感激。不幸的是,提供的 .htaccess 规则并没有帮助我。我仍然得到 404。更改 .htaccess 后我尝试过的操作:重新启动 apache 服务器;清除浏览器数据、缓存等;尝试了不同的浏览器;将 /portfolio/ 文件夹更改为 /portfolio1/ 以使其与portfolio.php 页面不同。不幸的是,这些尝试都没有帮助。
    • 新观察:将RewriteCond %{REQUEST_URI} ^/project/portfolio/(\w+)$ 重写为RewriteCond %{REQUEST_URI} ^/project/(\w+)$ 使页面localhost/project/src/pages/portfolio/showcase1.php 可通过http://localhost/project/showcase1 访问。换句话说,真正的问题是在输出 URL 中指定任何项目的子目录以使页面可在 localhost/project/subdirectory-name/page-name 访问是行不通的。
    • @rade363 我在重写规则的正则表达式中忘记了“投资组合”
    猜你喜欢
    • 2010-10-03
    • 2012-01-11
    • 1970-01-01
    • 2018-11-07
    • 2017-04-22
    • 2013-03-07
    • 2018-06-09
    • 1970-01-01
    相关资源
    最近更新 更多