2014-09-25 64 views
1

所以我试图使用网址重写来简化网站上的网址。保存旧目录位置的Apache URL重写?

用法示例:

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/文件夹而非/文件夹加载。所以他们没有找到。

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

回答

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> 

因此,您不需要更改您引用的所有页面上的代码

2)

它是把所有你的CSS的样式/目录是个好主意,然后在.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 

UPDATE(关于你的评论)

如果您使用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

请务必记住,重写与重定向不同。浏览器不知道正在发生的重写;它只是看起来像文件夹结构。

网站资源的相对URL由浏览器解析。所以,如果你访问www.example.com/test/x,以及浏览器看到<link href="style.css">,它自然读取此为www.example.com/test/x/style.css,并试图要求该文件,只接收404

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

+0

在文件头中使用''标签有什么优点/缺点? – user3420034 2014-09-25 02:36:03

+0

看看我更新的答案。 – 2014-09-25 02:54:02