【发布时间】: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.png 或 http://www.domain.com/d/?xy7r.png 重定向到 http://d.domain.com/u/xy7r.png
(注意:www. 在所有情况下都是可选的)
我想要什么
调整我现有的应用程序以使用 Apache 的 mod_rewrite。
示例
网址缩短器:
http://s.domain.com/xy7r 或 http://www.domain.com/s/xy7r
图片上传器:
http://d.domain.com/xy7r.png 或 http://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