RewriteRule用于几个参数

时间:2015-05-24 17:48:35

标签: apache .htaccess mod-rewrite

我目前正在开发一个由自制CMS驱动的项目,我遇到了一些URL重写问题。

这就是事情:所有网站都集中在​​主目录中的index.php周围。根据他认为的URL,index.php显示正确的页面(页面包含在inc / pages /文件夹中)

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?page=$1 [NC]

对于单个参数,它工作得很好。 http://demo.com/subscribe/或demo.com/subscribe确实会将$ _GET ['页面']传输到索引。

对于某些页面,我确实需要第二个参数。因此,每个页面都不需要它。例如,http://demo.com/edit/I-love-Stackoverflow应传输$ _GET [' snd_param')

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)?$ index.php?page=$1&snd_param=$2 [NC]

我试过了,但这并不好用。首先,如果未提及第二个参数(demo.com/edit),它将无法正常工作。索引没有收到正确的$ _GET ['页面']。其次,当提到第二个参数时,它"工作"但是apache认为这是一个目录。然后我的索引页面位于虚构的#I; love-Stackoverflow"文件夹和加载CSS,图像和JavaScript失败。

我希望我能清楚地解释我的问题!在此先感谢帮助我

1 个答案:

答案 0 :(得分:0)

您应该单独处理规则。规则之前的所有条件仅适用于单个规则,因此基本上不会执行第二个RewriteRule

您可以使用以下内容:

RewriteEngine on

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)$ index.php?page=$1&snd_param=$2 [L]
  

我的索引页面位于虚构的“I-love-Stackoverflow”中   文件夹和加载CSS,图像和JavaScript失败。

您可能使用相对路径加载资源,因此浏览器只知道您的情况下未修改的网址(http://demo.com/edit/I-love-Stackoverflow),并且在浏览器加载资源时会创建错误的网址。如果您使用绝对路径而不是相对路径加载资源,那么您将没问题。