3

我已经查看了有关此主题的多个线程,但是所有线程都在处理多个参数,而且对 .htaccess 还是很陌生,我无法弄清楚如何修改答案以适应我的需要。

我正在使用 .htaccess 重写 URL,除了我尝试重写分页 URL 时,一切似乎都很顺利。

我的分页网址非常简单: blog.php?page=2 但由于某种原因我无法将网址重写为 /blog/page/2 。当我尝试将其路由到该 URL 时,我收到“内部服务器错误”。现在我将它重写为 /blog-page/2,这没关系,但我更喜欢 /blog/page/2。

我的 .htaccess 文件中有很多事情要做,所以我只会发布重写:

RewriteEngine On

# Full path
#RewriteBase /

# Rewrite all php files    
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

# Rewrite the user profile pages
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^user/([a-zA-Z0-9_-]+)$ profile.php?user=$1
RewriteRule ^user/([a-zA-Z0-9_-]+)/$ profile.php?user=$1

# Rewrite the company profile pages
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^company/([a-zA-Z0-9_-]+)$ employer.php?user=$1
RewriteRule ^company/([a-zA-Z0-9_-]+)/$ employer.php?user=$1

# Rewrite the blog post pages
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^post/([a-zA-Z0-9_-]+)$ entry.php?id=$1
RewriteRule ^post/([a-zA-Z0-9_-]+)/$ entry.php?id=$1

# Rewrite the job listing pages
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^job/([a-zA-Z0-9_-]+)$ listing.php?id=$1
RewriteRule ^job/([a-zA-Z0-9_-]+)/$ listing.php?id=$1

# Rewrite blog pagination
RewriteRule ^blog/page/([0-9]+)$ blog.php?page=$1 
RewriteRule ^blog/page/([0-9]+)/$ blog.php?page=$1  

显然,我遇到的问题是博客分页的最终 RewriteRule。为什么我不能使它成为 /blog/page/2 但我可以使它成为 /blog-page/2?

我还尝试对博客类别和工作类别进行多页 .htaccess 重写,但我不断收到内部错误。我想要 1 次重写博客的工作类别和博客类别。这就是我所拥有的:

# Rewrite the category queries
RewriteRule ^/category/(.*)/?$ /$.php?cat=$1 [L,QSA]

是否可以使此分页重写适用于 2 个不同的页面?比如blogs.php和jobs.php?

RewriteCond %{REQUEST_FILENAME} !-f另外,在我制定重写规则之前是否有必要继续放置?还是1次就够了?

4

1 回答 1

2

您是否检查过 apache 错误日志以获取有关错误消息的信息?如果没有,那么每当您收到 500 内部错误消息时,这是第一个开始的地方。

看看apache 手册中的RewriteCond。看来您希望 RewriteCond 可以为多个规则工作,但这不是它的工作方式。RewriteCond 仅适用于下一个 RewriteRule。您可以将多个 RewriteCond 行链接在一起以获得单个 RewriteRule,但如果您希望 RewriteCond 应用于 RewriteRules,则必须将其放在每行之前。

好消息是您的大多数规则都不需要 RewriteCond:

RewriteEngine On

# Rewrite all php files    
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]

# Rewrite the user profile pages
RewriteRule ^user/([a-zA-Z0-9_-]+)/?$ profile.php?user=$1 [L]

RewriteCond 
# Rewrite the company profile pages
RewriteRule ^company/([a-zA-Z0-9_-]+)/?$ employer.php?user=$1 [L]

# Rewrite the blog post pages
RewriteRule ^post/([a-zA-Z0-9_-]+)/?$ entry.php?id=$1 [L]

# Rewrite the job listing pages
RewriteRule ^job/([a-zA-Z0-9_-]+)/?$ listing.php?id=$1 [L]

# Rewrite blog pagination
RewriteRule ^blog/page/([0-9]+)/?$ blog.php?page=$1 [L]

我对您的规则进行了一些更改:

  1. 删除了大部分 RewriteCond 规则。如果您计划在任何目录中包含一些静态文件,则需要添加RewriteCond %{REQUEST_FILENAME} !-f规则以便为它们提供服务。
  2. 通过添加 ? 来合并处理尾随 / 的规则 使斜线可选。
  3. 在您的规则中添加 [L] 以指示在找到并执行匹配项后无需运行其他规则。查看apache 手册中的RewriteRule以获取有关可用标志的更多详细信息。
于 2013-02-07T07:12:27.537 回答