Apache - 使用 httpd.conf 中的 mod_rewrite 删除 .php 和 .html 文件扩展名
Apache - remove .php and .html file extensions using mod_rewrite in httpd.conf
运行 Ubuntu 14.04 上的 Apache 2。 rewrite_module 已启用 (sudo apachectl -M
)。
在 /etc/apache2/apache2.conf(httpd.conf 的 Ubuntu 版本)中,我有以下代码块:
<Directory /var/www/>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond /%{REQUEST_FILENAME}.php -f
RewriteRule ^([a-zA-Z0-9_-\s]+)/$ /.php
RewriteCond /%{REQUEST_FILENAME}.html -f
RewriteRule ^([a-zA-Z0-9_-\s]+)/$ /.html
</IfModule>
<IfModule mod_expires.c>
...
<IfModule mod_headers.c>
...
</IfModule>
</IfModule>
</Directory>
运行 sudo service apache2 restart
.
当我访问服务器上没有 .php 文件扩展名的 url 时,我得到了 404!为什么这不起作用?
你的规则在 htaccess 上下文中对我来说工作得很好。但是当我将这些规则添加到 serverConfig 上下文时,服务器返回了 404 not found。实际上,问题在于在 serverConfig 上下文中 RewriteRule 模式中的前导斜杠是必需的。因此,您需要在规则的模式中添加前导斜线:
RewriteRule ^/([a-zA-Z0-9_-\s]+)/?$ /.php
我终于明白了。对我有用的是:
<Directory /var/www/>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ .php [L]
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ .html [L]
</IfModule>
<IfModule mod_expires.c>
...
<IfModule mod_headers.c>
...
</IfModule>
</IfModule>
</Directory>
是的,我花了 2 个小时尝试所有操作,直到我删除了 $1 上的前导斜线(即“$1”而不是“/$1”),然后一切正常。与另一位用户的评论相反。尽管我确实需要 RewriteRule 正则表达式中的斜杠来匹配请求的文件名,但在我将其更改为“^(.*)$”并首先使用 RewriteCond 进行测试之前。
运行 Ubuntu 14.04 上的 Apache 2。 rewrite_module 已启用 (sudo apachectl -M
)。
在 /etc/apache2/apache2.conf(httpd.conf 的 Ubuntu 版本)中,我有以下代码块:
<Directory /var/www/>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond /%{REQUEST_FILENAME}.php -f
RewriteRule ^([a-zA-Z0-9_-\s]+)/$ /.php
RewriteCond /%{REQUEST_FILENAME}.html -f
RewriteRule ^([a-zA-Z0-9_-\s]+)/$ /.html
</IfModule>
<IfModule mod_expires.c>
...
<IfModule mod_headers.c>
...
</IfModule>
</IfModule>
</Directory>
运行 sudo service apache2 restart
.
当我访问服务器上没有 .php 文件扩展名的 url 时,我得到了 404!为什么这不起作用?
你的规则在 htaccess 上下文中对我来说工作得很好。但是当我将这些规则添加到 serverConfig 上下文时,服务器返回了 404 not found。实际上,问题在于在 serverConfig 上下文中 RewriteRule 模式中的前导斜杠是必需的。因此,您需要在规则的模式中添加前导斜线:
RewriteRule ^/([a-zA-Z0-9_-\s]+)/?$ /.php
我终于明白了。对我有用的是:
<Directory /var/www/>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ .php [L]
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ .html [L]
</IfModule>
<IfModule mod_expires.c>
...
<IfModule mod_headers.c>
...
</IfModule>
</IfModule>
</Directory>
是的,我花了 2 个小时尝试所有操作,直到我删除了 $1 上的前导斜线(即“$1”而不是“/$1”),然后一切正常。与另一位用户的评论相反。尽管我确实需要 RewriteRule 正则表达式中的斜杠来匹配请求的文件名,但在我将其更改为“^(.*)$”并首先使用 RewriteCond 进行测试之前。