mod_rewrite:使规则适用于子域和子文件夹

时间:2012-05-23 18:59:07

标签: apache subdomain subdirectory mod-rewrite

元数据

我的服务器设置

具有通配符子域和可选前面的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或者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设计的,所以它们不起作用 URI类似http://www.domain.com/sub

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

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

我的.htaccess到目前为止

(仅适用于网址缩短,因为直到我开始工作才开始)

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>

1 个答案:

答案 0 :(得分:0)

对于第一组规则,请替换

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]