元数据
我的服务器设置
具有通配符子域和可选前缀 www 的共享主机。我不能接触 httpd.conf 并且有有限的 .htaccess 指令,尽管 RewriteRule 等适用。
我使用每个目录的 .htaccess 文件。
我的服务器布局
大多数子文件夹(阅读:一些用于 gfx 等)是独立的应用程序,f.ex:URL 缩短器,图像上传站点。
通常的 PHP 控制器设置
要操作应用程序,请使用 f.ex。查看已上传的特定文件,我阅读了该文件$_SERVER['QUERY_STRING']
以便使用 URI,例如http://s.domain.com/?image.jpg
从存储位置检索它。
此设置可能因应用程序而异。
问题
我有的
例子
网址缩短器:
http://s.domain.com/?xy7r
ORhttp://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 并且一切正常,然后我注意到因为它们是为 URI 设计的,http://sub.domain.com
所以它们不适用于http://www.domain.com/sub
.
我决定尝试设置条件,以便规则适用于两种 URI 情况。所以我使用 Google-FUd 并阅读规范、文档和教程。我不完全理解这个指令,但我认为我在网上也没有找到任何合适的解决方案或类似的问题。
然后我放弃了,并认为我会将第二个 URI 语法 ( http://www.domain.com/sub/
) 重定向到首选的 ( http://sub.domain.com
) (Also 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/
ors
或/s
不满足之类的值。
无论如何,我处于句号,我不知道如何进行。任何帮助表示赞赏!
谢谢!
</WOT>