【问题标题】:mod_rewrite: Make rules apply to both subdomains and subfoldersmod_rewrite:使规则适用于子域和子文件夹
【发布时间】:2012-05-30 08:52:57
【问题描述】:

元数据

我的服务器设置

具有通配符子域和可选前缀 www 的共享主机。 我不能接触 httpd.conf 并且有有限的 .htaccess 指令,尽管 RewriteRule 和类似的东西适用。

我使用每个目录的 .htaccess 文件。

我的服务器布局

大多数子文件夹(阅读:一些用于 gfx 等)是独立的应用程序,f.ex:URL 缩短器,图像上传站点。

通常的 PHP 控制器设置

要操作应用程序,f.ex.查看已上传的特定文件,我阅读了 $_SERVER['QUERY_STRING'] 以便使用像 http://s.domain.com/?image.jpg 这样的 URI 从存储位置检索它。

此设置可能因应用程序而异。

问题

我有什么

示例

网址缩短器:

http://s.domain.com/?xy7r OR http://www.domain.com/s/?xy7r 从数据库中检索哈希并重定向用户。

图片上传器:

http://d.domain.com/?xy7r.pnghttp://www.domain.com/d/?xy7r.png 重定向到 http://d.domain.com/u/xy7r.png

(注意:www. 在所有情况下都是可选的)

我想要什么

调整我现有的应用程序以使用 Apache 的 mod_rewrite。

示例

网址缩短器:

http://s.domain.com/xy7rhttp://www.domain.com/s/xy7r

图片上传器:

http://d.domain.com/xy7r.pnghttp://www.domain.com/d/xy7r.png

我的方法

起初我像一个快乐的黑客一样添加 RewriteRules 并且一切正常, 然后我注意到,由于它们是为 http://sub.domain.com 这样的 URI 设计的,因此它们不适用于 像 http://www.domain.com/sub 这样的 URI。

我决定尝试设置条件,以便规则适用于两种 URI 情况。 所以我使用 Google-FUd 并阅读规范、文档和教程。我不完全理解这个指令,但我认为我在网上也没有找到任何合适的解决方案或类似的问题。

然后我放弃了,并认为我应该将第二个 URI 语法 (http://www.domain.com/sub/) 重定向到首选的 (http://sub.domain.com) (也称为 http://www.sub.domain.com),然后应用我的现有RewriteRule

到目前为止我的 .htaccess

(仅适用于 URL Shortener,因为在我开始工作之前我不会继续前进)

RewriteEngine On
RewriteCond %{HTTP_HOST} !^s\.domain\.com$ [NC]  # Exclude correct URI
RewriteCond %{HTTP_HOST} !^$  # Exclude old HTTP requests
RewriteCond %{REQUEST_URI} ^/s($|/.*$)  # Rewrite bad URI
RewriteRule ^.* http://s.domain.com/$1 [R=permanent]  # Redirect to correct URI

RewriteCond %{REQUEST_URI} !^/fonts/  # Exclude system folder
RewriteCond %{REQUEST_URI} !^/index.php  # Exclude system file
RewriteCond %{REQUEST_URI} !^/style.css  # -||-
RewriteCond %{REQUEST_URI} !^/script.js  # -||-
RewriteCond %{REQUEST_URI} !^/short.php  # -||-
RewriteRule ^(.+)$ http://s.domain.com/?$1  # Rewrite to actual URI

我得到了什么

URI 就像 http://s.domain.com/xy7r 一样工作,就像 www. 前面一样,但是 http://www.domain.com/s/xy7r URI 语法只是重定向到 http://s.domain.com 并忽略 xy7r 部分。

问题

我是在正确的轨道上还是有更好/更正确的方法来做到这一点? 我一直在尝试理解 RewriteBase 指令,但我根本不理解它,并且尝试像 RewriteBase /s/s/s 这样的值不满足。

无论如何,我都处于句号,我不知道如何继续。 任何帮助表示赞赏!

谢谢!

</WOT>

【问题讨论】:

  • 在第 5 行,将 ^.* 替换为 ^(.*)$ 并在最后一行去掉问号(为什么会出现?)
  • 我会试试的。谢谢你。问号将其重写为 s.domain.com/?the_text,因为我的 PHP 脚本读取我帖子开头提到的 QUERY_STRING。
  • 嗯好吧..问号不应该是问题。这是我提到的第一件事。
  • 它不起作用。更多信息:第 5 行最初是:RewriteRule ^.* http://s.domain.com%1 [R=permanent](注意 %)我尝试使用您的方法,它继续使用 s.domain.com/xy7r 方法,但 domain.com/s/xy7r 仍然重定向相同。在我看来,它重定向到 s.domain.com,然后其余规则根本不匹配。现在第 5 行:RewriteRule ^(.*)$ http://s.domain.com/$1 [R=permanent] 我也尝试过:%1 在上面的行。没有运气。
  • 哦。虽然它还不能工作,但我只是注意到如果在数据库中找不到哈希,我的 php 脚本会重定向到 s.domain.com。将其更改为打印 $_SERVER 表明它得到的是:[REQUEST_URI] => /?http://s.domain.com/2p1bq

标签: apache subdomain subdirectory mod-rewrite


【解决方案1】:

对于第一组规则,替换

RewriteCond %{REQUEST_URI} ^/s($|/.*$)  # Rewrite bad URI
RewriteRule ^.* http://s.domain.com/$1 [R=permanent]  # Redirect to correct URI

RewriteRule ^s/?(.*) http://s.domain.com/$1 [L,R=302]

【讨论】:

  • 是的!现在我们正在讨论。似乎工作。虽然:http://www.domain.com/shttp://www.domain.com/s/ 有或没有 www. 重定向到 http://s.domain.com/?index.php 我尝试将其更改为:RewriteRule ^s/(.*) http://s.domain.com/$1 [L,R=302] (删除问号) 但这没有区别。另外,还有一个问题:为什么 302:临时移动,不应该永久移动?谢谢。
  • index.php 是从哪里来的? .htaccess 还有更多内容吗?抱歉,302 是一个错字。设为 301。
  • 我不知道。我猜它以某种方式从 DirectoryIndex 中得到它。也许在我无法访问的核心 httpd.conf 中。尝试不同的方法,基本上(据我所知)是,如果 URI domain.com/s/ 中的斜杠后面没有任何内容或根本没有斜杠,则它不应该添加问号,因为重定向到 s.domain.com/index.php 很好。
  • 还是一样。奇怪的是因为www.domain.com/s/style.css 不重定向但显示文件(我猜这很好),www.domain.com/s/script.js 也不会重定向并显示文件。但是www.domain.com/s/index.php 重定向到s.domain.com/?index.php,似乎一定有其他规则导致了这种情况。不过,我嵌入的 .htaccess 内容是完整的。
  • 我想然后在你的第二组规则中添加另一行: RewriteCond %{REQUEST_URI} !^$ # -||-
猜你喜欢
  • 2011-12-01
  • 2011-11-16
  • 2011-01-14
  • 2011-06-15
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
相关资源
最近更新 更多