【问题标题】:How to rewrite URLs using mod_rewrite in .htaccess files如何在 .htaccess 文件中使用 mod_rewrite 重写 URL
【发布时间】:2013-03-29 22:48:27
【问题描述】:

有没有关于如何使用 mod_rewrite 更改 URL 的良好、清晰的参考资料?

我正在尝试进行基本的 URL 重写,当我试图解决这个问题时,我发现人们提出了一百万个问题以及许多随机示例,但没有一个资源可以解释它是如何实现的作品 以及所有选项是什么,等等。有时我很幸运并找到了与我正在尝试做的类似的事情,但通常有许多不同的版本。有时他们都工作。有时他们都没有。所以这是一个猜谜游戏。

我找到了apache mod_rewrite 文档,但它读起来像是廉价的立体声说明。 (只是一堆细节和例子,没有明确的关系)所以我还在猜测很多事情。

我将包括我正在尝试做的事情,以防它是一个简单的答案,但我更喜欢 RTFM,以便下次我可以自己弄清楚:

example.com/hideme/* --> example.com/* (隐藏特定子目录)

【问题讨论】:

  • 我一直观察到最大的问题是如何处理从浏览器到网络服务器的 URL 的概念(以及在网络服务器处理 URI 时,mod_rewrite 扮演什么角色)。因为“将 URL 从 X 更改为 Y”的概念根本没有任何意义。
  • 这正是我最大的问题......有什么意义?

标签: apache .htaccess mod-rewrite


【解决方案1】:
# security requirement
Options +FollowSymlinks

# turn rewrite engine on
RewriteEngine on

# you only need to do those directives above once per .htaccess

# remap example.com/ w/ or w/o slash in the end into example.com/hideme/
RewriteRule ^/?$ /hideme/

# remap example.com/$group into example.com/hideme/$var
RewriteRule ^(.+)$ /hideme/$1

# redirect example.com/hideme w/ or w/o slash in the end into example.com/
RewriteRule ^hideme/?$ / [R]

# redirect example.com/hideme/$group into example.com/$var
RewriteRule ^hideme/(.+)$ /$1 [R]

实际上,我不知道上面的代码是否有错误,这就是为什么程序员总是测试他们所做的事情,如果它有效,他们就完成了,不需要将他们的代码与其他代码进行比较什么更好.这是我最喜欢的指令之一,我认为是最简单的:http://corz.org/serv/tricks/htaccess2.php


其他链接:

http://semlabs.co.uk/journal/mod_rewrite-quick-reference-and-cheat-sheet 是我在寻找 mod_rewrite 模式语法、RewriteCond 运算符等时经常访问的。

【讨论】:

  • 这看起来是一个很棒的链接。我去看看。我一直特别想要的是对 RewriteRule 指令语法的清晰解释。我倾向于将其视为正则表达式搜索/替换,但我认为这不太正确。
  • @Emerson 检查我添加的链接。
【解决方案2】:

$DOCUMENT_ROOT 目录中使用这个.htaccess 来隐藏目录_wp

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+_wp/([^\s]+) [NC]
RewriteRule ^ /%1 [R=302,L]

# assuming your cake installation is in /tests
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (?!^tests/)^(.*)$ /_wp/$1 [L,NC]

这将从 URL 中删除 /_wp

btw there is a book on mod_rewrite 以及那些有用的 Google 搜索结果除外。

【讨论】:

  • 谢谢!你能澄清一下关于 R=302 的部分吗?
  • R=302 表示用 status=302 重写 URL。如果您只想进行内部转发(不重写 URL),那么标志应该是:NC,L.
  • 我忘了问,那个 .htaccess 文件应该放在哪里? hidme 上面的根?
  • 是的,它应该转到 DOCUMENT_ROOT 目录,我认为它是 hideme 的父目录。
  • 子目录中是否有其他 .htaccess 文件有关系吗?我目前正在开发一个 cakePHP 项目,该项目的用户和 htaccess 在 hideme/app/webroot/ 中,我也认为在 hideme/app 中。我不确定多个文件如何交互。
猜你喜欢
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多