2

我已经成功创建了我的 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 目录中。所以我要写的 URL 是 mydomain.com/newwebsite/event/2

您注意到它说“2”,这只是页面/事件 ID。再往下,它将不是 id,而是它的标题。

4

3 回答 3

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]
于 2012-11-01T15:31:26.460 回答
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 中具有决定是否需要将其作为事件处理的逻辑(即是否存在具有这样名称的事件)。

于 2012-11-01T15:27:04.077 回答
0

在我看来,您的第二个示例有两个重写规则试图捕获相同的东西 (^(.+)$) 并将请求发送到两个不同的地方:

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

您需要一些东西来区分它们以便触发任何规则:

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

或者您需要将请求发送到单个文件/页面/处理程序 - 一个可以为您处理逻辑并呈现正确内容的前端控制器。

于 2012-11-01T15:27:39.490 回答