我已经成功创建了我的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,而是它的标题。
答案 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,它可以为您处理逻辑并显示正确的内容。