Apache URL重写保留旧目录位置?

时间:2014-09-25 01:29:42

标签: php apache .htaccess mod-rewrite url-rewriting

因此,我尝试使用网址重写来简化网站上的网址。

使用示例:

www.example.com/test -> www.example.com/index.php?page=test
www.example.com/test/x -> www.example.com/index.php?page=test&value=x

我用它来重写:

RewriteEngine on

#Simplify url
RewriteRule ^(\w+)/?$ index.php?page=$1
RewriteRule ^test/(\w+)/?$ index.php?page=test&value=$1

问题是这种方法似乎在重写之前保留了位置。因此,网站上加载的其他文件(如CSS)相对于原始位置而不是重写后的位置。

例:
www.example.com/test/x重写为 www.example.com/index.php?page=test&value=x

但是,当用户输入www.example.com/test/x时加载的CSS文件相对于/test/文件夹而不是/文件夹加载。所以他们找不到。

我做错了什么吗?我认为重写会直接重定向,所以这样的事情不会成为问题。我想解决这个问题,而不是仅仅使用绝对网址 - 所以我仍然可以在我的测试服务器上使用它。

2 个答案:

答案 0 :(得分:1)

1)

使用绝对URL没有错。您可以使用define

对于开发环境使用:

define('BASE_URL', 'http://test.server.local/');

然后对于生产环境,只需将其更改为:

define('BASE_URL', 'http://www.example.com/');

在您的代码的所有页面上,您可以访问这些网址

<a href="<?=BASE_URL.'test/x'?>">x page</a>

因此,您无需在引用BASE_URL

的所有页面上更改代码

2)

最好将所有css放在styles /目录中,然后放在.htaccess文件中,exclude it from rewriting可以这样:

RewriteEngine on

# add this line:
RewriteRule ^/?styles/.+$ - [L]

#Simplify url
RewriteRule ^(\w+)/?$ index.php?page=$1
RewriteRule ^test/(\w+)/?$ index.php?page=test&value=$1

更新(关于您的评论)

如果您使用BASE_URL的概念,则在服务器上创建正确的URL,然后将其传递给浏览器。如果您使用<base>,则依赖于客户端(用户使用的浏览器)。在服务器端使用BASE_URL是一个好习惯,因此您不会依赖客户端的浏览器。

查看此答案:Is it recommended to use the base html tag?

您还可以将php文件(具有define()功能)包含在您的所有页面中,因此无需在每个页面上使用<base>Here is a nice example of using this

答案 1 :(得分:1)

重要的是要记住重写与重定向不同。浏览器不知道正在发生的重写;它只是看到了文件夹结构。

浏览器解析了网站资源的相对URL。因此,如果您访问www.example.com/test/x,并且浏览器看到<link href="style.css">,它会自然将其读为www.example.com/test/x/style.css,并尝试请求此文件,仅接收404。

一种常见的解决方案是始终使用www.example.com/style.css等绝对网址。您很可能将网站的网址存储为常量并使用<link href="<?php echo SITE_URL; ?>/style.css">