具有通配符子域和可选前面的www的共享主机。 我无法触及httpd.conf并且限制了.htaccess指令,尽管RewriteRule等适用。
我使用每个目录.htaccess文件。
大多数子文件夹(读取:一些用于gfx等)是独立的应用程序,f.ex:一个URL缩短器,一个图像上传站点。
操纵应用程序,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.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设计的,所以它们不起作用
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
(仅适用于网址缩短,因为直到我开始工作才开始)
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>
答案 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]