0

元数据

我的服务器设置

具有通配符子域和可选前缀 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/?xy7rORhttp://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/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/xy7rURI 语法只是重定向到http://s.domain.com并忽略xy7r部分。

问题

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

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

谢谢!

</WOT>

4

1 回答 1

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]
于 2012-05-23T21:31:48.713 回答