因此,我尝试使用网址重写来简化网站上的网址。
使用示例:
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/
文件夹而不是/
文件夹加载。所以他们找不到。
我做错了什么吗?我认为重写会直接重定向,所以这样的事情不会成为问题。我想解决这个问题,而不是仅仅使用绝对网址 - 所以我仍然可以在我的测试服务器上使用它。
答案 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">
。