我有一个用于清理网址的mod_rewrite规则:
RewriteRule ^tshirts*$ /thsirt.php
我们的想法是,访问myurl.com/tshirt
或myurl.com/tshirts
应该重定向到myurl.com/tshirt.php
。
访问myurl.com/tshirt
正确显示tshirt.php
,直到我添加了一个外部样式表链接到tshirt.php
- 现在它实际上重定向到CSS文件,所以我留下了原始来源CSS文件(tshirt.css
)。
为了让它更加混乱,如果我导航到myurl.com/tshirts
,它会抛出404.
tshirt.php
的来源:
<html>
<head>
<title>Page title</title>
<link rel="stylesheet" type="text/css" href="/tshirt.css" />
</head>
<body>
<h1>Hello, world.</h1>
</body>
</html>
tshirt.css
的来源:
body{
background-color: #4F5557;
}
知道可能导致此问题的原因或解决方法吗?
答案 0 :(得分:2)
最好的解决方案是覆盖你的所有基础,基本上确保你只会重写你需要的东西,而不是任何不应该的东西。
首先,默认情况下,您应该使用以下方法来重写任何引用特定文件或目录的内容:
# Do Not apply if a specific file or folder exists
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
添加以下内容还允许您指定某些目录以忽略规则,这些目录可能用于其他目的,例如被调用的脚本或要外部链接的资源。
# Do Not apply if refering to a resource in one of these folders
RewriteCond %{REQUEST_URI} "/admin/" [OR]
RewriteCond %{REQUEST_URI} "/scripts/" [OR]
RewriteCond %{REQUEST_URI} "/external/"
RewriteRule (.*) $1 [L]
最后,你可以拥有你的规则
RewriteRule ^tshirts*$ /tshirt.php
答案 1 :(得分:0)
通常您不希望重写任何现有文件或目录的URL,因此在您的规则之前添加2个条件:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^tshirts*$ /thsirt.php
不同类型资源的清晰文件夹结构也有助于保持项目的可管理性。