多个mod_rewrite规则

时间:2012-11-01 15:16:59

标签: php apache .htaccess mod-rewrite

我已经成功创建了我的mod_rewrite规则来更改站点顶层的所有动态URL,但现在我需要为第二级创建一个规则,我想以后我可能需要第二个,第二个重写水平。

目前我有这个

    RewriteEngine on 
    RewriteCond %{SCRIPT_FILENAME} !-d
    RewriteCond %{SCRIPT_FILENAME} !-f
    RewriteRule ^(.+)$ index.php?subj=$1

这有助于将/index.php?subj=home更改为/ home,因为iut会对所有其他页面(例如/ contact / about / events等)进行更改。

但是现在我在事件下创建了子页面,因此需要将/events.php?event=event-name更改为/ event-name。但是,当我添加另一条规则时,它会弄乱整个网站。我试图做的是这个

    RewriteEngine on 
    RewriteCond %{SCRIPT_FILENAME} !-d
    RewriteCond %{SCRIPT_FILENAME} !-f
    RewriteRule ^(.+)$ index.php?subj=$1
    RewriteRule ^(.+)$ event.php?event=$1

但那没有用。

但最重要的是,我想将index.php和/(根)重定向到/ home

任何人都可以告诉我正确的规则,因为我一直在寻找,但我似乎无法做到正确。

非常感谢提前:)

干杯

更新: 感谢您的帮助到目前为止,我已经尝试了一切,但似乎无法做到正确。根据Ben的建议,我将提供有关URL的更多信息。 现在整个网站都坐在一个子目录中,现在它仍在开发中,所以现在它位于mydomain.com/newwebsite/event.phpevent=2 但.htaccess文件当前位于开发站点的根文件夹中,因此它位于/ newwebsite目录中。 所以我想写的网址是mydomain.com/newwebsite/event/2

您注意到它显示为'2',这只是页面/事件ID。更进一步,它不是id,而是它的标题。

3 个答案:

答案 0 :(得分:2)

您正在测试相同的条件两次,您需要区分正则表达式以测试独特的功能。

我会重写与此类似的文件:

# Turn on the rewrite engine
RewriteEngine On

# Ignore existing files and directories
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

# Set the general first level rewrites
RewriteRule ^home/?$ index.php?subj=home [NC]
RewriteRule ^event/(.+)$ event.php?event=$1 [NC]

或者您也可以按照以下方式分层次地进行操作。这将使用第一场比赛:

# Turn on the rewrite engine
RewriteEngine On

# Ignore existing files and directories
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

# Set all the rewrites
RewriteRule ^event/(.+)$ event.php?event=$1 [L]
RewriteRule ^(.+)$ index.php?subj=$1 [L]

答案 1 :(得分:0)

执行此操作的简单方法是链接到/ event / eventName而不是仅链接到/ eventName。这样你就可以把逻辑放在.htaccess中了:

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^/event/(.+)$ event.php?event=$1 [L]
RewriteRule ^(.+)$ index.php?subj=$1 [L]

此处的[L]表示处理应在到达匹配后停止。

另一种方法是将所有请求发送到index.php?subj =并且在index.php中有逻辑来决定是否需要将其作为事件处理(即是否存在具有此类名称的事件)

答案 2 :(得分:0)

在我看来,你的第二个样本有两个重写规则试图抓住同样的东西(^(。+)$)并将请求发送到两个不同的地方:

    RewriteRule **^(.+)$** index.php?subj=$1
    RewriteRule **^(.+)$** event.php?event=$1

你需要一些东西来区分它们才能解决任何规则:

    RewriteRule **^home/(.+)$** index.php?subj=$1
    RewriteRule **^events/(.+)$** event.php?event=$1

或者您需要将请求发送到单个文件/页面/处理程序 - front controller,它可以为您处理逻辑并显示正确的内容。