【发布时间】:2015-01-01 00:24:28
【问题描述】:
好的。首先,我知道在 StackOverflow 上对这样的问题有多个答案,但它们只帮助了我一部分。 不幸的是,很多答案都非常具体,仅对原始提问者的情况有所帮助。 因此,如果我能得到一个可以扩展到其他用户问题的解释(如果我需要在其他页面中使用它,对我自己来说),那就太好了。也就是说,我的问题如下:
我一直在尝试使用 mod_rewrite 将我的 URL 简化为更容易让我的用户在地址栏中键入的内容。 因此,我必须编辑 .htaccess 以在外部隐藏 .php 扩展名,并编辑要遵循的代码上的所有链接。 我发现有效的重写规则如下:
Options +FollowSymLinks -MultiViews
RewriteEngine On
# Unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ http://localhost/website/$1 [R=301,L]
# Redirect external .php requests to extensionless url
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.+)\.php$ http://localhost/website/$1 [R=301,L]
# Assume php file for extensionless php urls
RewriteRule ^([^/.]+)$ $1.php [L]
这些只处理外部重定向,但对我来说,我并不认为需要内部重定向,因为我只需要编写 URL 的简短形式就可以了。 如果您只是将它们添加回 html 表单中,就没有理由隐藏扩展程序,对吧?
我通过 GET 方法接收用户名来绘制用户页面。
www.webpage.com/userpage.php?view=username
我想要的是要变成的网址
www.webpage.com/user/username
当我最终找到适用于此的规则时,没有加载 CSS 文件。图像可以加载或不加载取决于我使用的规则。 我放弃了我写的那个,因为它不仅这样做,而且还在其他地方添加路径。
RewriteRule ^(.*[^/]) userpage.php?view=$1 [QSA,L]
基本上,这条规则将“/userpage/”应用于域上的所有链接,无论我在地址栏中输入了什么。 当我使用 userpage.php 输入完整的内容时,它会将其重写为 userpage/userpage/user。
RewriteRule ^user/(\w+)/?$ userpage.php?view=$1
非常相似,结果相同,但也没有显示图像。 我知道这里的问题在于相对路径,但是只需将所有路径更改为绝对路径就会删除代码中的所有可移植性。
我知道我在这里真正需要的是使它只有在路径中包含 /user/ 的页面才能被重写。
我不仅想了解我需要对规则应用什么样的条件,只改变我想要的,而不是其他一切,但如果有人能告诉我是否有办法无法通过完整路径访问的页面。
例如www.fullpath.com/user/username 显示页面,但 www.fullpath.com/userpage?view=username 无法访问。
【问题讨论】:
-
其他答案 (
<base href=>) 肯定涵盖了 CSS/图像问题。重写user/username确实是最常见的 RewriteRules 之一。都不涉及处理 THE_REQUEST 或 QUERY_STRING。请详细说明您究竟尝试了什么,以及某些东西是如何“破坏”的。 -
我尝试了针对 CSS/图像问题的“
”修复,但没有奏效。我还尝试在规则上添加完整路径并使用 RewriteBase 修复它。那也没有用。不过,我真的不记得我用来达到那个点的确切代码是什么。 -
没有人使用 RewriteBase 做生意。如果您无法使更简单的基本 href 工作,请使用绝对图像/css URL。再一次,对于
user/\w+重写的具体建议,你需要弥补一些东西。否则您的问题将以 copypasta 作为答案。 -
基本上我使用的规则是
RewriteRule ^(.*[^/]) userpage.php?view=$1 [QSA,L],但解决方法对此不起作用。它仍然给我带来了很多麻烦,因为它一直在到处添加“/userpage/”。它没有做我想要的。它太基础了,没有得到适当的限制。是的,我真的不想要一个复制意大利面的答案。 -
这与问题中的完全一样,以相同的顺序(仅使用破坏代码的 2 条规则之一)。我稍微简化了帖子。有很多不相关的信息。
标签: php apache .htaccess mod-rewrite path