【问题标题】:Mod-rewrite rules to manipulate query string修改查询字符串的重写规则
【发布时间】: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


【解决方案1】:

保持你的 .htaccess 像这样:

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

## Unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+?)/$ $1 [R=302,L,NE]

RewriteRule ^user/([^/]+)/?$ userpage.php?view=$1 [L,QSA,NC]

# To internally forward /dir/file to /dir/file.php
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f [NC]
RewriteRule ^(.+?)/?$ $1.php [L]

还可以在页面 HTML 的 <head> 部分添加:<base href="/" />,以便从该 URL 而非当前页面的 URL 解析每个相对 URL

【讨论】:

  • 这只是让它转发内部链接。外部链接不起作用。因此,如果您键入“domain.com/page”,它将不起作用,因为它不知道它应该查找“.php”文件。
  • domain.com/page 得到 404 吗? page.php 存在吗? domain.com/page.php 有效吗?
  • 是的,是的,不是的。它在本地计算机上运行,​​而不是专用服务器。如果您只是重定向内部页面,它只会将我单击的链接更改为无扩展路径。但是,如果您不使用我在 .htaccess 上已有的代码,它不会像 PHP 一样读取无扩展名文件。无论哪种方式,我的主要问题都不在于普通页面。它与 userpage.php 上的查询有关。
  • 只想在这里明确地留下:所有页面都在根目录上。没有“/user/”目录,只有 userpage.php 文件。我想重命名它,就好像有一个 /user/ 目录,然后是查询字符串上的用户名。
  • 如果domain.com/page.php 给出404,那么domain.com/page 也会给出404。检查/user/... 的更新代码
猜你喜欢
  • 1970-01-01
  • 2016-08-13
  • 2016-11-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 2012-03-08
  • 2018-01-24
相关资源
最近更新 更多