使用PHP重写URL

时间:2011-12-24 12:20:14

标签: php mod-rewrite rewrite

以下是我的PHP项目的文件夹结构

PHPProject (Root)
-->Admin/
-->Config/
-->File1.php
-->File2.php
--> ..
--> ..
-->.htaccess
-->File10.php

我想为可以通过以下方式访问的项目启用RewriteURL。

规则1: 应始终使用www.mydomain.com访问我的域名。如果有人试图以http://mydomain.com身份进行访问,则必须将网址重写为http://www.mydomain.com。我在我的htaccess上使用以下规则

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
#RewriteCond %{HTTP_HOST} !^www\.mydomain\.com [NC]
#RewriteRule ^(.*)$ http://www.mydomain.com/$1 [L,R=301]
</IfModule>

规则2: 我想有一个指向页面的特定URL:

http://www.mydomain.com/username重写为http://www.mydomain.com/file4.php?name=username

规则3:

我能够让第一条规则与.htaccess文件中的上述信息一起正常工作,但问题是我必须对其上的域名进行硬编码。是否可以指定通用(正则表达式)以使规则适用于多个域?

问题: 我需要帮助将规则1 +规则2 +规则3完全合并为我的.htaccess文件中的规则。

有人可以帮助我实现这个目标。

2 个答案:

答案 0 :(得分:1)

规则1:

RewriteCond %{HTTP_HOST} !^www\.(domain1|domain2|domain3|domain4)\.com [NC]
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [L,R=301]

或:

RewriteCond %{HTTP_HOST} !^www\.domain1\.com [NC]
RewriteCond %{HTTP_HOST} !^www\.domain2\.com [NC]
RewriteCond %{HTTP_HOST} !^www\.domain3\.com [NC]
RewriteCond %{HTTP_HOST} !^www\.domain4\.com [NC]
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [L,R=301]

规则2

http://www.mydomain.com/username

http://www.mydomain.com/file4.php?name=username

RewriteRule ^username$ /file4.php?name=username [QSA,NC,L]

如果你想把它变成通用的(用alphanum chars):

RewriteRule ^([a-z0-9]+)$ /file4.php?name=$1 [QSA,NC,L]

规则3

全力以赴:

RewriteCond %{HTTP_HOST} !^www\.(domain1|domain2|domain3|domain4)\.com [NC]
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [L,R=301]

RewriteRule ^([a-z0-9]+)$ /file4.php?name=$1 [QSA,NC,L]

希望这有帮助。

两个提示:

请尝试使用RewriteLog指令:它可以帮助您找出此类问题:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

我最喜欢检查regexp的工具:

http://www.quanetic.com/Regex(别忘了选择ereg(POSIX)而不是preg(PCRE)!)

答案 1 :(得分:0)

如果你只需要http,那应该这样做。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST}!^(www\.¦$) [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

而且,其余的你可以使用Front Controller Pattern

[Front Controller Pattern的想法是将您的所有请求重定向到php文件并从那里决定]

请按照以下网址进行操作,如果您有任何疑问,可以提问:)

http://www.phppatterns.com/docs/design/the_front_controller_and_php

http://onlamp.com/pub/a/php/2004/07/08/front_controller.html?page=2